我在没有原型的ECMAScript中创建一个空对象,并定义了一些这样的属性:
obj.name // John
obj.age // 27
obj instanceof Object // false
obj.prototype // undefined
obj.constructor // undefined
此处, obj 不是Object的实例。
Object.__proto__
尝试使用两种方法使obj成为某个实例,以扩展这个空对象。
使用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!
不起作用。
class SpecialObject extends EmptyObject { ... }
let obj = new SpecialObject()
obj instanceof SpecialObject // also false
使用ES6 类扩展扩展EmptyObject也不起作用。
var obj = new EmptyObject()
obj instanceof Object // false
obj instanceof EmptyObject // true
我尝试通过给 obj 一个原型和构造函数名称属性来伪装实例,就像普通的Object一样,但这不会改变instanceof的返回值。
在某种程度上可以使这种类型的Object成为某种实例吗?也许通过不同的方式将它包装在一个函数中或使用ES6类扩展?如果您认为这是最好的实现方法,我不介意迭代Object键或在函数中手动清除它们。
目的是创建一个Object 非实例的Object(没有原型等),但可以是某事物的实例。这有可能吗?也许是以鬼鬼祟祟的方式。
{{1}}
谢谢!
答案 0 :(得分:2)
在构造函数中分配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
。