选项1:
NotificationsService.push = function (notifications) {}
选项 2:
NotificationsService.prototype.push = function (notifications){}
直接定义函数与在原型链上定义函数有什么区别?是继承吗?
选项1:
NotificationsService.push = function (notifications) {}
选项 2:
NotificationsService.prototype.push = function (notifications){}
直接定义函数与在原型链上定义函数有什么区别?是继承吗?
这是什么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() {...};
但是,这两个属性彼此没有任何关系。
总结:在这两种情况下,您都是在不同的对象上定义方法,因此必须以不同的方式使用。做什么取决于您的用例。
第一种情况只会影响您声明的对象的当前实例
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 的第二个实例,它将继承绑定到父原型的任何方法,并且没有方法直接附加到同级实例。
我能给你的最好建议是阅读这篇文章,它是迄今为止我所见过的对原型设计最好的解释之一,但只是为了提一下,使用两者都会给你相同的最终结果,但方法不同,我的除非你真的需要一个原型,否则首选是使用第一个。
原型是对象的相等扩展。
如果在 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