最初我将函数对象分配给变量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();
提前致谢!
答案 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)