3

选项1:

NotificationsService.push = function (notifications) {}

选项 2:

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

直接定义函数与在原型链上定义函数有什么区别?是继承吗?

4

4 回答 4

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() {...};

但是,这两个属性彼此没有任何关系。


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

于 2013-11-03T20:14:43.713 回答
1

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

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

实例函数你好

在这种情况下,应将第二种情况应用于父“类”(尽管 js 没有类)

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

原型函数 Hello

如果你声明了 WhatService 的第二个实例,它将继承绑定到父原型的任何方法,并且没有方法直接附加到同级实例。

于 2013-11-03T20:05:48.360 回答
1

我能给你的最好建议是阅读这篇文章,它是迄今为止我所见过的对原型设计最好的解释之一,但只是为了提一下,使用两者都会给你相同的最终结果,但方法不同,我的除非你真的需要一个原型,否则首选是使用第一个。

于 2013-11-03T20:06:05.993 回答
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
于 2013-11-03T20:08:05.943 回答