原型链中的函数解析如何作为构造函数用于Object.prototype

时间:2016-10-13 05:47:56

标签: javascript constructor prototype prototype-chain

我指的是this article on Helephant.com,以了解Javascript如何在对象上调用时解析原型链中的函数。

文章引用,

  

如果对象没有直接在其上设置方法,则javascript会查找创建该对象的构造函数。 Javascript检查构造函数的方法原型属性。

在下面的代码中,如果检查rufus.constructor是全局Object()构造函数,那么JS将直接检查全局Object(),因为rufus.constructorObject()或者是根据上面的文章引用,它将首先查看构造函数,然后查找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; 

2 个答案:

答案 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中却是一种痛苦,通常函数就足够了。