gpt4 book ai didi

javascript - JavaScript 中有没有一种方法可以实例化不一定是函数的对象?

转载 作者:行者123 更新时间:2023-11-30 18:39:44 27 4
gpt4 key购买 nike

我的原型(prototype)示例是以下伪代码:

var kind = ...;
...
var type = new kind();
...
var person = new type();
...
var john = new person();

但这里的问题是 type 不是一个函数,所以 new type() 不会工作。是否有一个特定的属性可以添加到对象中以使其为 new 所接受?

对我来说最重要的是原型(prototype)链,这对我来说很重要,即 person.[[Prototype]] 应该是 type 等,在new 无法实现的情况。

创建子类型链不是一种选择。这里的 typeperson 的元类型,而不是它的父类(super class)型。同样,kind 是一种元元类型。以下测试可以阐明要求:当一切都完成后,我想要这些积极的测试:

console.log(john instanceof person);   // should be true
console.log(person instanceof type); // should be true
console.log(type instanceof kind); // should be true

这些阴性测试:

console.log(john instanceof type);     // should be false
console.log(john instanceof kind); // should be false
console.log(person instanceof kind); // should be false

我听说通过分配给 __proto__ 属性可以实现一些这种魔法,但不知道如何实现。显然,如果有的话,一种可移植的解决方案(例如通过使用 Object.create)是更受欢迎的。

最佳答案

Is there an specific property that you can add to an object to make it acceptable to new?

没有。根据 ECMAScript 第 11.2.2 节控制此功能的属性称为 [[Construct]],从方括号中可以看出,它是一个内部属性。它不受 ECMAScript 代码的影响。根据 13.2 节,[[Construct]] 唯一一次被赋值是在创建 Function 对象时。

在 ECMAScript 第三版中,您对原型(prototype)继承的唯一访问是通过创建具有 prototype 属性的构造函数。即使您不打算对它做任何事情,您也必须创建该函数。 This question涵盖类/实例系统的常见模式。

在 ECMA 5 中,您确实得到了 Object.create()。为了与当前尚不支持它的浏览器兼容,您可以使用什么都不做的临时构造函数自己实现 Object.create() 的那部分,例如:

if (!('create' in Object)) {
Object.create= function(proto, props /* optional */) {
var obj;
if (proto===null) {
obj= {};
} else {
Object.create._construct.prototype= proto;
obj= new Object.create._construct();
Object.create._construct.prototype= null;
}
if (props!==undefined)
Object.defineProperties(obj, props);
return obj;
};
Object.create._construct= function() {};
}

(当然 Object.defineProperties 是另一种 ES5 方法,如果你想支持它,你必须加入它,而这在普通 ES3 中是不可能实现的,只能使用其他浏览器扩展.)

I hear that by assigning to the __proto__ property one can do some magic of this sort, but don't know how.

这一直是非标准的,甚至在 Firefox 中也会消失。别管它了。

关于javascript - JavaScript 中有没有一种方法可以实例化不一定是函数的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7211024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com