选项1:
NotificationsService.push = function (notifications) {}
选项2:
NotificationsService.prototype.push = function (notifications){}
直接定义函数与原型链之间的区别是什么?是继承吗?
答案 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