为什么我们不能调用原型函数?

时间:2016-07-17 10:58:45

标签: javascript class inheritance prototypal-inheritance

最初我将函数对象分配给变量Person。此时,Person的 proto 指向Function.prototype。然后我向Person.prototype添加了一些函数。当我用下面的new关键字调用Person构造函数并将其分配给var test时,据我所知,它将测试 proto 设置为Person.prototype。此Person.prototype是一个对象,其中getName映射到一个函数。因此,当我调用test.getName()时,它会在test.prototype中搜索该函数,如果它没有在那里找到它,那么它将在其 proto 中搜索该函数,即Person .prototype。

现在假设我创建了另一个函数对象并将其分配给变量Customer。它的 proto 将指向Function.prototype。然后继承我们应该做Customer.prototype = new Person()。我很困惑为什么要这样做?它是否将客户的 proto 设置为Person.prototype。如果确实如此,那我就不应该写Customer = new Person()。如果它不是,那么客户 proto 仍指向Function.prototype还是还有其他我缺少的东西?

var Person = function(name) {
    this.name = name;
    console.log("Running the constructor of Person " + name)
}

Person.prototype.getName = function() {
    return this.name;
}

var test = new Person("Yolo");
console.log(Person.prototype.getName.call(test))
console.log(test.getName());

var Customer = function(name) {
    this.name = name;
    console.log("Running the constructor of Customer " + name)
};

Customer.prototype = new Person();

提前致谢!

3 个答案:

答案 0 :(得分:1)

Customer.___proto____ = Function.prototype 

它将始终指向函数原型

Customer.prototype = new Person();

此声明将使Customer.prototype ._____ proto_____指向Person.Prototype

客户._____ proto_____永远不会仅通过继承改变原型的____proto___更改

答案 1 :(得分:1)

这里有两个不同的概念:

  • __proto__是继承树中对象的父级。
  • prototype是一个函数的属性,用于定义__proto__在用作构造函数时创建的任何对象的内容。

由于构造函数本身就是对象(函数对象),因此它们也位于继承树中,但该树与这些构造函数创建的对象的继承树无关。它们是两个不同的世界。

查看此代码,该代码说明了客户对象的继承链:

var cust = new Customer('Jack');
console.log(cust.__proto__ === Customer.prototype); // true
console.log(cust.__proto__.__proto__ === Person.prototype); // true
console.log(cust.__proto__.__proto__.__proto__ === Object.prototype); // true

所以我们遵循cust对象的原型链。这是与构造函数(函数)的链完全不同的链:

console.log(Customer.__proto__ === Function.prototype); // true
console.log(Person.__proto__ === Function.prototype); // true
console.log(Object.__proto__ === Function.prototype); // true

这里没什么不寻常的:它们是功能。此外,没有必要改变任何东西。如上所述,它与这些构造函数创建的对象的继承无关。

请注意,您永远不需要访问__proto__属性。以上内容仅用于说明继承链。

答案 2 :(得分:0)

enter image description here

我发现此图片很有用。它清楚地显示了所有链接。