解释此object.prototype语法

时间:2016-12-10 05:15:58

标签: javascript

我想知道为什么当我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;

1 个答案:

答案 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;财产指向适当的功能。