我想知道为什么当我console.log(Triangle.prototype)
时,它只显示{}而不是显示实际的构造函数及其属性side1 side2
等。当我console.log(Triangle.prototype.constructor)
它将显示函数构造函数时。还有Triangle.prototype.constructor = Triangle
做什么?为什么我再次将Triangle构造函数设置为Triangle构造函数。当我这样做时,Triangle.prototype = new Shape()
,我通过继承Shape()
属性来进行继承吗?做Triangle.prototype.constructor = new Shape()
实际上会超过原来的Triangle构造函数吗?
var Shape = function(){
this.type = '';
}
Shape.prototype.get_type = function(){
return this.constructor;
}
var Triangle = function(s1, s2, s3){
this.s1 = s1;
this.s2 = s2;
this.s3 = s3;
}
Triangle.prototype = new Shape();
Triangle.prototype.constructor = Triangle;
module.exports = Triangle;
答案 0 :(得分:0)
在你的示例代码中,他们明确地设置了构造函数,因为它是酷孩子所做的事情。这允许人们确定什么"种类"实体一可能正在与之合作。
var kid = new Bob();
console.log( kid == instanceof Bob ); // -> true
因此,通过显式设置构造函数,您可以将其更改为其他内容。但除了指向"构造函数"之外,它不会影响任何其他事情。属于另一个功能。
构造函数不是很有用,但已经写入了该语言。在较新版本的Javascript(例如ES6-7)中,他们开始使用它做更多事情。
别担心"构造函数"当你在代码中看到它。 "构造函数"只是一个无意义的属性,指向主要功能。
更改"构造函数"财产不会改变原型或影响任何东西。
函数本身就是一个构造函数。所以也许这就是Javascript语言的作者包含属性的原因,因此编译器/ JavaScript引擎可以确定哪个函数是构造函数。
混淆?是
此示例显示"构造函数" property就像指向函数的任何其他变量一样。
var Bob = function(){
// This function is known as a "constructor".
}
var sameAsConstructor = Bob;
var areTheySame = Bob.prototype.constructor == sameAsConstructor;
console.log ( areTheySame ); // areTheySame = "true"
这是一个例子,证明除了"构造函数"之外没有其他任何变化。属性。
// ---------------------------------------
// A "base class"
// ---------------------------------------
var Shape = function(arg){
this.name = arg;
}
Shape.prototype.seeSize = function(){
console.log("Shape.prototype.seeSize", this.size);
}
Shape.prototype.seeName = function(){
console.log("Shape.prototype.seeName", this.name);
}
// ---------------------------------------
// Let's set up another one and try to extend
// our "base class" using the "constructor"
// ---------------------------------------
var Circle = function(arg){
this.size = arg;
}
// Now let's try setting the constructor
// ... in an effort to "try" and leverage
// the Shape function.
Circle.prototype.constructor = Shape;
你可能会认为Circle函数现在将被Shape函数替换?
<强>不。强>
作为一项测试,我们将制作一个新Circle的实例,然后看看到底是什么&#34;设置&#34;我们的论点是:
var sally = new Circle("bob");
尝试并访问方法?
try {
sally.seeSize();
} catch(e) {
console.log("tried seeSize", e);
}
try {
sally.seeName();
} catch(e) {
console.log("tried seeName", e);
}
<强>不。强>
两者&#34;尝试&#34;失败。
<强>再次... 强>
原型与&#34;构造函数&#34;无关。属性。原型是一种完全不同的动物。
现在让我们看看实际上已经设置了#34;我们的arg。在这里,我们可以看到&#34;尺寸&#34;得到了设置,就像在Shape函数中一样。
console.log("sally.size", sally.size); // size = "bob"
在这里,如果我们假设通过替换构造函数&#34; name&#34;会被设定......不。
console.log("sally.name", sally.name); // name = undefined
但是,您会看到构造函数确实存在 指向Shape函数...而不是Circle函数。
console.log("sally.constructor", sally.constructor);
所以,是的,非常混乱和无目的。
最后
在您的示例代码中:
Triangle.prototype = new Shape();
这会导致Triangle获取Shape原型上定义的所有函数和属性,并将它们应用于Triangle。这样,Triangle的任何实例都可以使用Shape中的任何方法。
然后他们重置&#34;构造函数指向Triangle,因为当设置Triangle的原型时,它也会选择Shape&#39; s&#34;构造函数&#34;属性。
所以通过重置&#34;构造函数&#34;他们只是确保&#34;构造函数&#34;财产指向适当的功能。