首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ECMAScript --如何使空的'null‘对象成为某事物的实例

ECMAScript --如何使空的'null‘对象成为某事物的实例
EN

Stack Overflow用户
提问于 2017-08-23 22:15:55
回答 1查看 383关注 0票数 1

我在ECMAScript中创建了一个没有原型的空对象,并定义了如下一些属性:

代码语言:javascript
复制
var obj = Object.create(null)
obj.name = 'John'
obj.age = 27

在这里,obj不是对象的实例。

代码语言:javascript
复制
obj.name // John
obj.age // 27
obj instanceof Object // false
obj.prototype // undefined
obj.constructor // undefined

尝试使用两种方法扩展这个空对象使obj成为某物的实例。

使用Object.__proto__不起作用。

代码语言:javascript
复制
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也不起作用。

代码语言:javascript
复制
class SpecialObject extends EmptyObject { ... }
let obj = new SpecialObject()
obj instanceof SpecialObject // also false

我试图伪造实例,给obj一个原型和构造函数名称属性,就像普通对象一样,但这不会改变instanceof的返回值。

是否有可能使这种类型的对象成为某物的实例?也许是通过不同的方式将它封装在一个函数中,或者使用ES6类扩展?我不介意在函数中迭代对象键或手动清除它们,如果您认为这是最好的实现方法。

其目的是创建一个对象,它是--不是对象的实例--(没有原型,等等),但可以是某物的实例。这有可能吗?也许是以一种卑鄙的方式。

代码语言:javascript
复制
var obj = new EmptyObject()
obj instanceof Object // false
obj instanceof EmptyObject // true

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-08-23 22:30:53

在构造函数中分配this.__proto__ = Object.create(null)将完全禁止您扩展该类。别干那事。我怀疑你真正想要的是

代码语言:javascript
复制
function EmptyObject() {…}
EmptyObject.prototype = Object.create(null);

或在ES6中

代码语言:javascript
复制
class EmptyObject extends null {
  …
}

您可以实例化其中的instanceof,可以使用class语法对其进行扩展。使用new EmptyObject将创建一个从EmptyObject.prototype对象继承的对象,而后者实际上继承的是零继承(即null),而不是通常的Object.prototype

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45850107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档