分别什么情况下 给对象添加方法和给原型添加方法,使用上主要区别是?
原型方式,所有new 出来的,都可以使用本方法。对象方式添加方法只有当前对象能使用。另外补充,'abc'.toString(),也是new出来的,=new String('abc').toString()
从理论上讲
给原型添加方法foo1,每个实例的foo1都是一样的,他们都指向原型上的那个foo1;
给对象添加方法foo2,每个实例也都有foo2方法,但是这是他们自己的foo2,彼此之间不相等。
举个不恰当的例子
小明家有个汽车,小明家有个传统就是必须娶媳妇儿,小明取了媳妇儿然后生了老王老李两个儿子。
原型添加方法就好比,这个汽车老王、老李和他们的爸爸小明都能开,开的是同一辆车。
对象添加方法就好比 ,老王老李根据传统,又各自取了媳妇儿,虽然都有媳妇,但是都是自己的,长得不一样。
实际应用上讲,
各有优劣,主要和内存有关。
原型方法节省内存,但是是共享的。而且根据原型的动态性,一旦有一个实例有改动foo1方法,就会影响到其它实例。
汽车只有一辆,大家都开,节省了钱,但是汽车坏了,或者换个颜色就会影响到一家人。媳妇儿大家都有,各自只能用各自的,老王的媳妇儿回娘家了,不会影响老李的媳妇儿,但是因为都有各自的媳妇儿一家的口粮就吃得多了。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
使用上没有区别,之所以选择在原型上添加方法是多个对象共用一个方法,方法定义只有一份,节省了内存
示例
function Person(name) {
}
Person.prototype.eat = function() {
};
var p1 = new Person('haha');
var p2 = new Person('hehe');
p1.say === p2.say // false
p1.eat === p2.eat // true