我指的是this article on Helephant.com,以了解Javascript如何在对象上调用时解析原型链中的函数。
文章引用,
如果对象没有直接在其上设置方法,则javascript会查找创建该对象的构造函数。 Javascript检查构造函数的方法原型属性。
在下面的代码中,如果检查rufus.constructor
是全局Object()
构造函数,那么JS将直接检查全局Object(),因为rufus.constructor
是Object()
或者是根据上面的文章引用,它将首先查看构造函数,然后查找prototype属性等等.JS将如何解析函数(rufus.toString
)。我对此很困惑。
//PET CONSTRUCTOR
function Pet(name, species, hello)
{ this.name = name;
this.species = species;
this.hello = hello; }
Pet.prototype = {
sayHello : function(){
alert(this.hello);
}
}
//CAT CONSTRUCTOR
function Cat(name, hello, breed, whiskerLength)
{ this.name = name;
this.hello = hello;
this.breed = breed;
this.whiskerLength = whiskerLength;}
Cat.prototype = new Pet();
var rufus = new Cat("rufus", "miaow", "Maine Coon", 7);
rufus.toString;
答案 0 :(得分:2)
如果对象没有直接在其上设置方法,则javascript 然后查找创建该对象的构造函数。 Javascript检查构造函数的方法原型属性。
措辞令人困惑。 JavaScript通过__proto__
查找原型链,不使用constructor
属性。他们提到Constructor
因为通常是对象通过Constructor.prototype
属性获取原型的方式。但这并非总是如此。您可以像这样设置原型:
var rufus2 = Object.create(new Pet());
Object.getPrototypeOf(rufus) === Object.getPrototypeOf(rufus2); // true
关于如何解决toString
方法:
rufus.hasOwnProperty('toString'); // false -> go up
(new Pet()) rufus.__proto__.hasOwnProperty('toString'); // false -> go up
({sayHello :...}) rufus.__proto__.__proto__.hasOwnProperty('toString'); // false -> go up
(Object.prototype) rufus.__proto__.__proto__.__proto__.hasOwnProperty('toString'); // true
答案 1 :(得分:0)
function Person () { }
Person.prototype.sayName = function () { };
var bob = new Person();
console.log(bob.sayName === Person.prototype.sayName); // true
console.log(bob.constructor.prototype.sayName === Person.prototype.sayName); // true
console.log(bob.__proto__.sayName === Person.prototype.sayName); // true
console.log(bob.constructor === Person); // true
console.log(bob.__proto__ === Person.prototype); // true
这些是你们的关系
如果在某个对象上找不到属性/函数,它会向__proto__
链上升以查找它正在查找的内容。在较旧的浏览器中,JS开发人员无法访问__proto__
,但仍然是浏览器/节点在幕后使用的对象,以引用Constructor.prototype属性。
PS:尽量不要在JS中使用深层次结构。那是许多眼泪的道路。深层次结构会导致其他基于类的语言的痛苦,但在JS中却是一种痛苦,通常函数就足够了。