原型
原型和原型链的目的是解决构造函数生成的对象内共同属性重复生成的问题,使其更高效。在下面这个例子里每次生成一个实例对象都要生成一个mmm方法,没有必要,完全可以共享。
构造函数生成的对象称为实例对象
function Person(name,gender){
this.name = name
this.gender = gender
this.mmm = function reader(){
console.log('hello world')
}
}
var person1 = new Person(Jack,male)
var person2 = new Person(Lucy,female)
person1
和person2
是构造函数Person
生成的两个实例对象
function Person(name,gender){
this.name = name
this.gender = gender
}
Person.prototype.mmm = function reader(){
console.log('hello world')
}
var person1 = new Person(Jack,male)
var person2 = new Person(Lucy,female)
person1.mmm // 'hello world'
person2.mmm // 'hello world'
上面例子里构造函数Person
的prototype
属性就是person1
和person2
的原型对象,原型对象添加一个mmm
属性,两个实例对象都共享这个属性。
原型链
JS里面规定所有对象都有自己的原型对象,而原型对象也是对象因此也有自己的原型对象,而且任何一个对象都可以充当其他对象的原型,因此会形成一个原型链
如果一层层上溯,所有对象的原型都可以追溯到Object.prototype
,既Object
构造函数的prototype
属性,也就是说所有的属性都继承了Object.prototype
的属性,这就是所有对象都有valueOf()
和toString()
方法的原因,因为这两个方法在Object.prototype
里面。
需要注意Object.prototype
的原型是null
String.prototype是String公用属性引用(防止被垃圾回收)
网友评论