十一 原型

原型定义

原型是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

你可能感兴趣的:(十一 原型)