首页 > Js静态方法,原型方法

Js静态方法,原型方法

分别什么情况下 给对象添加方法和给原型添加方法,使用上主要区别是?


给对象添加的方法,对象的每个实例都有实例各自的方法;
给对象的原型添加方法,对象的每个实例共享同一个方法。


从理论上讲
给原型添加方法foo1,每个实例的foo1都是一样的,他们都指向原型上的那个foo1;
给对象添加方法foo2,每个实例也都有foo2方法,但是这是他们自己的foo2,彼此之间不相等。

举个不恰当的例子
小明家有个汽车,小明家有个传统就是必须娶媳妇儿,小明取了媳妇儿然后生了老王老李两个儿子。
原型添加方法就好比,这个汽车老王、老李和他们的爸爸小明都能开,开的是同一辆车。
对象添加方法就好比 ,老王老李根据传统,又各自取了媳妇儿,虽然都有媳妇,但是都是自己的,长得不一样。

实际应用上讲,
各有优劣,主要和内存有关。
原型方法节省内存,但是是共享的。而且根据原型的动态性,一旦有一个实例有改动foo1方法,就会影响到其它实例。

汽车只有一辆,大家都开,节省了钱,但是汽车坏了,或者换个颜色就会影响到一家人。媳妇儿大家都有,各自只能用各自的,老王的媳妇儿回娘家了,不会影响老李的媳妇儿,但是因为都有各自的媳妇儿一家的口粮就吃得多了。


使用上没有区别,之所以选择在原型上添加方法是多个对象共用一个方法,方法定义只有一份,节省了内存
示例

function Person(name) {

this.name = name;
this.say = function() {
    console.log('say ' + this.name);
}

}

Person.prototype.eat = function() {

console.log('eat food');

};

var p1 = new Person('haha');
var p2 = new Person('hehe');

p1.say === p2.say // false

p1.eat === p2.eat // true


原型方式,所有new 出来的,都可以使用本方法。对象方式添加方法只有当前对象能使用。另外补充,'abc'.toString(),也是new出来的,=new String('abc').toString()

【热门文章】
【热门文章】