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中的原始类型。
-----------------------------分隔线---------------------------
当访问一个对象中的属性时,是自下而上查找的。比如:
当调用cat.toString()时,查找toString()方法的顺序是这样的:
1.首先在cat对象自身上查找,没找到。
2.在Cat.prototype属性上找,没找到。
3.由于Cat.prototype本身是一个对象,这里就是Object,于是在Object上找,找到了。
另一个复杂一点的例子:
当调用cat.eat()时,查找eat()方法的顺序是这样的:
1.首先在cat对象自身上查找,没找到。
2.在Cat.prototype属性上找,没找到。
3.Cat.prototype已经被指向一个Animal的实例,于是在这个匿名实例上查找,没找到。
4.在Animal.prototype属性上查找,找到了。
5.假设在步骤4中还是没找到,由于Animal.prototype本身是一个Object,接下来还会在Object上查找。
“读”属性的时候存在原型继承,而“写”属性的时候没有原型继承。自身的属性会覆盖从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上查找。