不明白以下两种写法在实质上有什么区别?
function Person() {
}
Person.prototype.age = function(n) {
return n;
}
var person = new Person();
person.age(9);
上面这种写法是通过原型,让实例化后的对象能够调用父类的函数。
下面这种方式不通过原型,但是在用法上完全一样。
function Person() {
this.age = function(n) {
return n;
}
}
var person = new Person();
person.age(9);
那两者在哪些方面有可比性呢? 求教,谢谢!
在内存节约方面有差别
第一种方式,prototye定义,所有后代都共享一个方法定义,内存中只有占一个空间,无论你创建了多少实例,所有实例的age方法都指向这个内存地址。
第二种方式,在构造函数内定义,每创建一个实例,age方法的定义就会分配一个空间,属于该实例专用。实例创建多了,内存成比例增长。
综上,如果是共有的方法,请放到prototype中。
第二种写法是构造函数模式,用是好用,但是这种方法的主要问题是每个方法都要在在每个实例上重新创建一遍。
第一种原型模式方法就解决了这个问题,让所有对象实例共享它所包含的属性和方法。
简单来说,功能一样,只不过大多数情况下会把方法写在原型中,把属性写在构造函数中,所以第一种方法更常用