object.key = fn()与object.prototype.key = fn()之间的区别?

时间:2013-11-03 19:59:00

标签: javascript prototype

选项1:

NotificationsService.push = function (notifications) {}

选项2:

NotificationsService.prototype.push = function (notifications){}

直接定义函数与原型链之间的区别是什么?是继承吗?

4 个答案:

答案 0 :(得分:2)

这里NotificationsService是什么?

如果是函数,则不同之处在于,在第二种情况下,NotificationsService的每个实例都将继承push

var instance = new NotificationsService();
instance.push(...);

在第一种情况下,您只需扩展NotificationsService,它对由它创建的实例没有任何影响:

var instance = new NotificationsService();
instance.push(...); // will throw an error
NotificationsService.push(); // will work

如果NotificationsService对象,我们假设NotificationsService.prototype存在并且是一个对象,那么它与原型链没有任何关系,你只需在两个不同的位置定义功能。这是一个更简单的例子:

var foo = {};
var foo.prototype = {};

// defines a method on foo
foo.push = function() {...};

// defines a method on foo.prototype
foo.prototype.push = function() {...};

这两个属性虽然没有任何关系。


总结:在这两种情况下,您都是在不同对象上定义方法,因此必须以不同方式使用。怎么做取决于你的用例。

答案 1 :(得分:1)

第一种情况只会影响您声明的对象的当前实例

var NotificationsService=new WhateverService();
NotificationsService.push=function(notifications) { 
    console.log('Instance function',notifications) 
};
NotificationsService.push('hello')
  

实例函数Hello

第二种情况应该应用于父级'Class'(尽管js没有类),在这种情况下 WhateverService

WhateverService.prototype.push=function(notifications) {
 console.log('Prototype function',notifications);   
}
var NotificationsService=new WhateverService();
NotificationsService.push('hello')
  

原型函数Hello

如果声明WhateverService的第二个实例,它将继承绑定到父类原型的任何方法,并且没有直接附加到兄弟实例的方法。

答案 2 :(得分:1)

我能给你的最好的建议是阅读this one它有迄今为止我见过的原型设计的最佳解释之一,但仅仅为了提及,使用两者将给你相同的最终结果但是使用不同的方法,我的偏好是使用第一个,除非你真的需要一个原型。

答案 3 :(得分:1)

原型是对象的延伸。

如果在A级使用

var b = new A()
b.prototype.job = "Nothing"

var c = new B()

console.log(c.job); //Nothing

//所有变量都有实例A,而下一个实例来自A,它将拥有道具工作

但如果只放

b.job =“没什么”;

变量C没有道具“工作”

console.log(c.job); //undefined