站在原型链旁边,可能是JavaScript中最不被理解的部分。
所以问题是:如何……
new dataObj(args);
...actually创建一个对象,并定义它的原型链/构造器/等?
最好是展示一个替代方案,充分理解这个关键字。
发布于 2011-07-20 01:00:11
new
运算符使用内部的[[Construct]]
方法,它基本上执行以下操作:
prototype
属性设置此对象的内部[[Prototype]]
。prototype
属性不是对象(基元值,如数字、字符串、布尔值、未定义或Null),则使用
创建对象后,它会调用该函数,并将该对象作为基元值提供给
new
运算符的等效实现可以表示为(假设ECMAScript 5 Object.create
方法可用):
function NEW(f) {
var obj, ret, proto;
// Check if `f.prototype` is an object, not a primitive
proto = Object(f.prototype) === f.prototype ? f.prototype : Object.prototype;
// Create an object that inherits from `proto`
obj = Object.create(proto);
// Apply the function setting `obj` as the `this` value
ret = f.apply(obj, Array.prototype.slice.call(arguments, 1));
if (Object(ret) === ret) { // the result is an object?
return ret;
}
return obj;
}
// Example usage:
function Foo (arg) {
this.prop = arg;
}
Foo.prototype.inherited = 'baz';
var obj = NEW(Foo, 'bar');
obj.prop; // 'bar'
obj.inherited; // 'baz'
obj instanceof Foo // true
发布于 2011-07-20 00:58:19
expression new C(arg1, arg2)
假设C是一个JavaScript函数(否则你会得到一个错误):
C
的"prototype
“属性的值。prototype
的默认值是一个对象(在声明函数时自动创建),其原型设置为Object.prototype
,并且一个constructor
属性指向函数C
.
C
时,将'this
‘设置为新对象,并使用提供的参数。C
返回一个对象,则此对象是表达式的结果。否则,新创建的对象将是表达式的结果。ECMAScript 5中new
的替代方法是使用内置的Object.createObject
方法。
new C(arg1, arg2)
等同于:
var obj = Object.createObject(C.prototype);
C.apply(obj, [arg1, arg2]);
标准JavaScript不允许您显式设置对象的原型,因此Object.createObject
不能在语言本身中实现。有些实现确实允许它通过非标准属性__proto__。在这种情况下,可以这样模拟new C
:
var obj = {};
obj.__proto__ = C.prototype;
C.apply(obj, [arg1, arg2]);
https://stackoverflow.com/questions/6750880
复制相似问题