OOP

prototype对象

构造函数的缺点

同一个构造函数的对象实例之间,无法共享属性。

prototype属性的作用

构造函数是一个函数,同时也是一个对象,也有自己的属性和方法,其中有一个prototype属性指向另一个对象,一般称为prototype对象。该对象非常特别,只要定义在它上面的属性和方法,能被所有实例对象共享。构造函数生成实例对象时,自动为实例对象分配了一个prototype属性。

  1. 只要修改prototype对象,变动就立刻会体现在实例对象。
  2. 如果实例对象自身就有某个属性或方法,它就不会再去prototype对象寻找这个属性或方法。
  3. 如果更改了构造函数prototype的引用,不会影响已经实例化的对象,但会影响之后构造的对象。
function Foo(){}
Foo.prototype.x=1;
typeof Foo.prototype;//"object"

Foo.prototype;//类似于以下对象
/*
{
    constructor:Foo,
    __proto__:Object.prototype,//大多数浏览器提供的一个非标准属性
    x:1
}
*/

原型链

由于原型本身也是对象,又有自己的原型,所以形成了一条原型链(prototype chain)。因为追根溯源,最源头的对象都是从Object构造函数生成(使用new Object()命令),所以如果一层层地上溯,所有对象的原型最终都可以上溯到Object.prototype。而Object.prototype的原型是null。

“原型链”的作用在于,当读取对象的某个属性时,JavaScript引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。以此类推,如果直到最顶层的Object.prototype还是找不到,则返回undefined。

Object.prototype;//类似于以下的对象
/*
{
    hasOwnProperty:...,
    valueOf:...,
    toString:...,
    __proto__:null
}
*/

获取对象的原型

一共有如下3种方法

  • obj.__proto__
  • obj.constructor.prototype
  • Object.getPrototypeOf(obj)
Object.prototype===Object.getPrototypeOf({});//ES5

Object.create、isPrototypeOf

Object.create(ES5)方法用于生成新的对象,可以替代new命令。它接受一个对象作为参数,返回一个以它作为原型的新对象。

var o1 = {};
var o2 = Object.create(o1);
var o3 = Object.create(o2);

o2.isPrototypeOf(o3) // true
o1.isPrototypeOf(o3) // true

构造函数的继承

function Person(name,age){
  this.name=name;
  this.age=age;
}
function Student(name,age,className){ Person.call(this,name,age); this.className=className; } Student.prototype=Object.create(Person.prototype); //Student.prototype=new Person(); Student.prototype.constructor=Student;

 

 

posted on 2015-11-07 11:30  cbwleft  阅读(170)  评论(0)    收藏  举报