constructor 属性只是 JavaScript 中的一个约定 (从 ES2015 起不再适用);它指向与存在constructor 属性的原型关联的函数。这是一个有点复杂的句子,所以:假设一个函数Foo。 Foo.prototype.constructor 将是 Foo。同样,假设var f = new Foo();,f.constructor 将是Foo。
它实际上并没有用于 JavaScript 标准中的任何内容。 (从 ES2015 开始,用于各种Promise 方法之类的东西。) em> 这只是一个约定,除非有人把它搞砸了(这很容易做到),否则一个对象将具有一个从其原型继承的 constructor 属性,该属性是用于创建它的函数。
我说这很容易打破,因为,嗯,确实如此,而且人们经常这样做。这是一个打破它的例子:
function Foo() {
}
Foo.prototype = {
bar: function() {
}
};
var f = new Foo();
console.log(f.constructor === Foo); // false
你引用的代码对于 JavaScript 来说是非常不寻常的:
最重要的是,它打破了一个非常重要的规则:您不能在构造函数中更改原型的属性(除了非常 极端情况)。 (尽管在这种特殊情况下,它以一种无害但毫无意义的方式这样做。)
它打破了 JavaScript 中的一个基本命名规则:构造函数以大写字母开头(Obj,而不是 obj)。
它展示了一种非常常见但从根本上被破坏的用于设置继承层次结构的模式。
因此,总的来说,我可能不会使用您从中获得该代码的任何资源。
FWIW,这是该代码的更正版本:
function Base() {
this.str = "hello world!.";
}
Base.prototype.printTxt = function () {
console.log(this.str);
};
function Derived() {
this.str = "Good bye";
}
Derived.prototype = Object.create(Base.prototype);
Derived.prototype.constructor = Derived;
Object.create 由 ECMAScript5 定义。它的这个单参数版本可以为旧引擎填充(它的多参数版本不能),如下所示:
if (!Object.create) {
Object.create = function(proto) {
if (arguments.length > 1) {
throw "The multi-argument version of Object.create cannot be shimmed.";
}
function ctor() { }
ctor.prototype = proto;
return new ctor();
};
}