我在ECMAScript中创建了一个没有原型的空对象,并定义了如下一些属性:
var obj = Object.create(null)
obj.name = 'John'
obj.age = 27在这里,obj不是对象的实例。
obj.name // John
obj.age // 27
obj instanceof Object // false
obj.prototype // undefined
obj.constructor // undefined尝试使用两种方法扩展这个空对象使obj成为某物的实例。
使用Object.__proto__不起作用。
function EmptyObject() {
this.__proto__ = Object.create(null)
this.foo = function() { // could use defineProperty
return this.bar // obviously does not exist here
}
return this
}
var obj = new EmptyObject()
obj instanceof EmptyObject // false!使用EmptyObject类扩展扩展ES6也不起作用。
class SpecialObject extends EmptyObject { ... }
let obj = new SpecialObject()
obj instanceof SpecialObject // also false我试图伪造实例,给obj一个原型和构造函数名称属性,就像普通对象一样,但这不会改变instanceof的返回值。
是否有可能使这种类型的对象成为某物的实例?也许是通过不同的方式将它封装在一个函数中,或者使用ES6类扩展?我不介意在函数中迭代对象键或手动清除它们,如果您认为这是最好的实现方法。
其目的是创建一个对象,它是--不是对象的实例--(没有原型,等等),但可以是某物的实例。这有可能吗?也许是以一种卑鄙的方式。
var obj = new EmptyObject()
obj instanceof Object // false
obj instanceof EmptyObject // true谢谢!
发布于 2017-08-23 22:30:53
在构造函数中分配this.__proto__ = Object.create(null)将完全禁止您扩展该类。别干那事。我怀疑你真正想要的是
function EmptyObject() {…}
EmptyObject.prototype = Object.create(null);或在ES6中
class EmptyObject extends null {
…
}您可以实例化其中的instanceof,可以使用class语法对其进行扩展。使用new EmptyObject将创建一个从EmptyObject.prototype对象继承的对象,而后者实际上继承的是零继承(即null),而不是通常的Object.prototype。
https://stackoverflow.com/questions/45850107
复制相似问题