对象属性的查找顺序

来源:互联网 发布:mouldflow软件 编辑:程序博客网 时间:2024/04/28 17:00
Therefore, property inheritance occurs only when you read property values, not when you write them. If you set the property p in an object o that inherits that property from its prototype, what happens is that you create a new property p directly in o. Now that o has its own property named p, it no longer inherits the value of p from its prototype. When you read the value of p, JavaScript first looks at the properties of o. Since it finds p defined in o, it doesn't need to search the prototype object and never finds the value of p defined there. We sometimes say that the property p in o "shadows" or "hides" the property p in the prototype object. Prototype inheritance can be a confusing topic.

“读”属性的时候存在原型继承,而“写”属性的时候没有原型继承。自身的属性会覆盖从prototype继承得到的属性。

-----------------------------分隔线---------------------------

利用原型继承,可以扩展javascript中的原始类型。
function test() {    var word = "hello 2011";    word.extendMethod();}String.prototype.extendMethod = function(){    alert("this is a new method for String...");};


-----------------------------分隔线---------------------------

当访问一个对象中的属性时,是自下而上查找的。比如:
function Cat(sName){    this.name = sName;}var cat = new Cat("kitty");cat.toString();

当调用cat.toString()时,查找toString()方法的顺序是这样的:
1.首先在cat对象自身上查找,没找到。
2.在Cat.prototype属性上找,没找到。
3.由于Cat.prototype本身是一个对象,这里就是Object,于是在Object上找,找到了。

另一个复杂一点的例子:
function Animal(nAge){    this.age = nAge;}Animal.prototype.eat = function(){    // eat something};function Cat(sName){    this.name = sName;}Cat.prototype = new Animal();Cat.prototype.constructor = Cat;var cat = new Cat("kitty");cat.eat();

当调用cat.eat()时,查找eat()方法的顺序是这样的:
1.首先在cat对象自身上查找,没找到。
2.在Cat.prototype属性上找,没找到。
3.Cat.prototype已经被指向一个Animal的实例,于是在这个匿名实例上查找,没找到。
4.在Animal.prototype属性上查找,找到了。
5.假设在步骤4中还是没找到,由于Animal.prototype本身是一个Object,接下来还会在Object上查找。