原型与原型链
1.原型
##原理:原型链的思想是,通过原型让一个引用类型继承另一个引用类型的属性和方法。
##原型是什么:当一个构造函数被创建出来的时候,系统会为这个构造函数关联一个空的对象,这个对象就是这个构造函数的原型。
##原型的作用:原型是一个对象,这个对象的属性和方法会被与其关联的构造函数创建出来的实例化对象共享。
##访问方式:
1.构造函数.prototype;
2.实例化对象.__proto__;(有兼容性,不推荐使用)
##原型的使用方法
1.使用对象的动态特效为原型添加属性和方法,适合添加少量属性时使用。
``
function Person(){
}
Person.prototype.sayHi=function(){
return "Hi,Tony";
}
var p=new Person();
console.log(p.sayHi()) // Hi,Tony
``
**
用构造函数来创建Person对象
function Person(){ }
var p=new Person()
***
2.直接给原型添加属性和方法
```
function Person() {
};
Person.prototype = {
name: "yj",
age : "24",
height :"176",
sayHi:function() {
return "Hi,shark";
}
}
var p = new Person();
console.log(p.sayHi()); //Hi,shark
````
**
添加属性少,用第一种
添加属性多,则用第二种
***
2.原型链
原理:对象也有原型,原型也是对象,所以原型也有原型,这就形成了一个由原型组成的链式结构,称为原型链。
##Object.prototype是所有对象的原型,可以说是原型链的终点,向上找一层是最顶层null.
``
Person --构造函数;
p --实例化对象
p=Person{}
Person.prototype--Person的原型
p.__proto__ --p的原型
Person.prototype.constructor --Person
Person.prototype.__proto__ --Object.prototype
Object.prototype.__proto__ --null
```
属性搜索原则
要通过一个对象访问某个属性时,要遵循属性搜索原则
1.首先在对象中进行查找,如果有这个属性,那么直接使用
2.如果没有,则在对象的原型中进行查找,如果有,直接使用
3.如果还没有,则在原型的原型中进行查找,有就使用
4.如果仍然没有,则会沿着原型链一直向上找,直到找到为止或者找到Object.prototype为止
原型使用注意事项
1.一般只需将共享的属性放在原型中,下级对象即可访问
2.当要访问对象的某个属性时,会遵循属性搜索原则
3.当要为对象某个属性赋值时,不会遵循属性搜索原则,只会在本对象进行查找,如果有,则赋值,没有,则添加。
4.如果为构造函数的prototype属性赋值时,那么赋值前创建的对象和赋值后创建的对象原型不一致。