ECMAScript - 如何制作一个空的' null'反对某事物的实例

时间:2017-08-23 22:15:55

标签: javascript

我在没有原型的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}}

谢谢!

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