在JavaScript中是否有一种方法可以实例化一个不一定是函数的对象
Is there a way in JavaScript to instantiate an object which is not necessarily a function?
我的原型示例是以下伪代码:
var kind = ...;
...
var type = new kind();
...
var person = new type();
...
var john = new person();
但这里的问题是,type
不是一个函数,所以new type()
不会工作。是否有一个特定的属性,你可以添加到一个对象,使其接受new
?
对我来说最重要的是原型链,那就是对我来说最重要的,那就是person.[[Prototype]]
应该是type
,等等,以防new
不可能。
不能创建子类型链。这里type
是person
的元类型,而不是它的超类型。同样,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
- 为什么可以't我使用成员方法初始化一个实例
- jstree 是空白的,并且在实例化后有一个空的
- 实例化一个javascript对象并在一行中填充其属性
- 为什么我在尝试实例化一个空的backbone.js视图时出现类型错误
- 如何为我的 class1 创建一个命名空间,然后将其实例化
- 在另一个对象中实例化一个对象
- 在 SAPUI5 中实例化片段时传递另一个控制器
- 在javascript中实例化一个新类时,不将其分配给变量有什么害处
- 是否可以在React组件实例化后添加一个关键属性
- 如何在Javascript中实例化一个对象圈
- 实例化一个对象,使其可以与多个指令共享
- 测试构造函数实例化另一个类
- 在旅途中实例化一个新的tinyMce
- 在javascript中实例化循环中的类使用最后一个值
- 在CoffeeScript中,我可以像在JavaScript中那样在声明上面实例化一个类吗?
- 有可能在TypeScript中实例化一个JavaScript对象吗?
- 如何实例化一个es6类,当它被webpack捆绑到一个函数中时
- 无法在不同文件中实例化一个类的对象
- 在getJSON完成之后实例化一个对象
- 从foreach中的viewModel实例化一个属性