在JavaScript中是否有一种方法可以实例化一个不一定是函数的对象

Is there a way in JavaScript to instantiate an object which is not necessarily a function?

本文关键字:一个 实例化 对象 不一定 函数 方法 是否 JavaScript 一种      更新时间:2023-09-26

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

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

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

对我来说最重要的是原型链,那就是对我来说最重要的,那就是person.[[Prototype]]应该是type,等等,以防new不可能。

不能创建子类型链。这里typeperson的元类型,而不是它的超类型。同样,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),则更可取。

是否有一个特定的属性,你可以添加到一个对象,使其接受new ?

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

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

在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中是不可能实现的,只能使用其他浏览器扩展)

我听说通过给__proto__属性赋值可以做一些这样的事情,但是不知道怎么做。

这一直是不标准的,甚至在Firefox中也正在消失。不用麻烦了。

尝试new type.constructor(),它将创建一个与type相同类型的新对象,这可能是您想要的

据我所知,您希望type继承kind ?是吗?

如果是这样…

function kind() {};
kind.prototype.name = "fred";
function type() {};
type.prototype = new kind();
var person = new type();
colsole.log(person.name);  //fred
console.log(person instanceof type);  // true
console.log(person instanceof kind);  // true
console.log(type.prototype instanceof kind);   //true