&引用;新";JavaScript中的运算符
我正在努力理解&引用;新";JavaScript中的运算符,javascript,constructor,Javascript,Constructor,我正在努力理解新的操作符。请查看以下功能: var _new = function(fn) { var obj = Object.create(fn.prototype); fn.apply(obj); obj.constructor = fn; // <--- EDIT: unnecessary return obj; }; 当然,它可以很容易地扩展到任意数量的参数(我只是想保持简单) 它似乎像new关键字一样工作。那么,如果有的话,区别是什么呢?new
新的操作符。请查看以下功能:
var _new = function(fn) {
var obj = Object.create(fn.prototype);
fn.apply(obj);
obj.constructor = fn; // <--- EDIT: unnecessary
return obj;
};
当然,它可以很容易地扩展到任意数量的参数(我只是想保持简单)
它似乎像new
关键字一样工作。那么,如果有的话,区别是什么呢?new
操作符对对象还做了什么?您是对的,这基本上就是new
所做的:创建一个从Func.prototype
继承的新对象,并调用Func
,使用此引用此新对象
不过,您的实现有一点不同:如果构造函数(Func
)不返回对象,将隐式返回此
。如果它返回一个对象(任何对象),那么它将成为构造函数调用的返回值
因此,更准确的复制是:
var _new = function(fn) {
var obj = Object.create(fn.prototype);
var result = fn.apply(obj);
return result != null && typeof result === 'object' ? result : obj;
};
就这样。如果愿意,可以将其视为语法糖,就像条件运算符一样
指向引用的一些指针:当使用new
时,将调用构造函数的内部[[Construct]]]
函数。具体发生的情况在规范的第1部分中进行了描述,它与您(和我)编写的函数基本相同
我不能完全确定的一点是,对象的内部[[Extensible]]
属性设置为true
。我假设您通过object.create
创建的每个对象在默认情况下都是可扩展的(如果它的原型是可扩展的)。这有帮助吗<代码>构造函数实际上是fn.prototype
的属性,而不是实例本身。@FelixKling哦,真的吗?我不知道。这使得代码更加简单。@Bergi是的,它是重复的(错过了那个)。显然,我可以投票结束我自己的问题。不错。:)哦,哇。这是一个有趣的特性。我一直认为构造函数返回什么并不重要。但我从未检查过这一点。:)谢谢你的回答!不客气:)添加了一些小注释……那么对象可扩展意味着什么呢?有不可扩展的物体吗?好问题。规范中说“如果为true,则可以将自己的属性添加到对象中。”。它似乎与有关,但我不知道这是否是唯一使用它的地方(在页面上搜索[[Extensible]]]
可能会提供更多信息)。@freakish:(.freeze()
和.seal()
做类似的事情)
var _new = function(fn) {
var obj = Object.create(fn.prototype);
var result = fn.apply(obj);
return result != null && typeof result === 'object' ? result : obj;
};