原型定义
原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。
function Person ( ) { } // Person.prototype -- 原型 在函数刚刚出生的时候就已经被定义好了
它是一个对象 Person.prototype = { } ,是构造函数制造出对象的祖先
Person.prototype.lastName = "deng";
var person = new Person ( ); // 此时,person.name = "deng"
var person1 = new Person ( ); // person1.name 也等于"deng"
// 在构造函数的原型上设置了属性或者方法, 那么构造函数也会有这个属性或者方法
但是如果函数自身有同名的方法或者属性,先访问自身的,如果没有,再去原型上找
利用原型特点和概念,可以提取共有属性
fuction Car ( color, owner) {
this.color = color;
this.owner = owner;
}
// 可以把共有属性提取出来,放在原型上
Car.prototype = {
height : 1400,
lang : 4900,
carName : "BMW"
}
var car = new Car ( ) ; //一定要new鸭,不然 emmmmm.......
Car.prototype 上有 constructor 和 __proto__
car.constructor --> function Car ( ) { } //浅粉色是系统自带的 紫色的是后来加的
可以在原型上更改constructor的值,function Person = { }; Car.prototype = { constructor : Person }
那么,此时 car.constructor --> function Person ( ) { } , constructor是可以改变的。
var this = {
__proto__ : Person.prototype
//如果构造函数上没有某个属性或者方法,会沿着 __proto__的指向去原型上面找
}
对象如何查看原型 -->隐式属性__proto__
对象如何查看对象的构造函数 -->constructor
可以通过改变person.__proto__ 的指向, 来改变原型
var obj = { name : "sunny" }
var person = new Person ( ) ;
person.__proto__ = obj; //此时person的原型变成了obj,person.name = "summy"
Person.prototype.name = "sunny";
function Person () {}
var person = new Person();
( 1 )Person.prototype.name = "cherry"; //person.name = "cherry" 不论写在哪里都是打印出cherry
( 2 )Person.prototype {
name = "cherry";
} //person.name = "sunny" 不改变,因为这个时候,__proto__的指向没有变
简单的例子在此
var obj = { name : "a" } ;
var obj1 = obj;
obj = { name : "b" }; // 此时obj1 的值还是a,对应下面的__proto__
相当于
Person.prototype = { name : "a" };
__proto__ = Person.prototype;
Person.prototype = { name : "b" }; //此时的 __proto__还是 指向原来的a
顺序不同时,把new放在后面
Person.prototype.name = "sunny";
function Person () {}
Person.prototype {
name = "cherry";
}
var person = new Person();
//把new放在后面的时候,还没有new,在对象生成前改变,所以会生效,打印出cherry