OOP
prototype对象
构造函数的缺点
同一个构造函数的对象实例之间,无法共享属性。
prototype属性的作用
构造函数是一个函数,同时也是一个对象,也有自己的属性和方法,其中有一个prototype属性指向另一个对象,一般称为prototype对象。该对象非常特别,只要定义在它上面的属性和方法,能被所有实例对象共享。构造函数生成实例对象时,自动为实例对象分配了一个prototype属性。
- 只要修改prototype对象,变动就立刻会体现在实例对象。
- 如果实例对象自身就有某个属性或方法,它就不会再去prototype对象寻找这个属性或方法。
- 如果更改了构造函数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.prototypeObject.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;
浙公网安备 33010602011771号