object.key = fn() 与 object.prototype.key = fn() 之间的差异

difference between object.key = fn() Vs object.prototype.key = fn()?

本文关键字:object fn key prototype 之间      更新时间:2023-09-26

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

不过,这两个属性彼此没有任何关系。


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

我能给你的最好的建议是阅读这个,它有我迄今为止见过的最好的原型解释之一,但只是为了提及,使用两者会给你相同的最终结果,但有不同的方法,我更喜欢使用第一个,除非你真的需要一个原型。

Protoype 是对象的相等延伸。

如果在 A 类中使用

var b = new A()
b.prototype.job = "Nothing"
var c = new B()
console.log(c.job); //Nothing

所有变量都有实例 A,A 的下一个实例将具有 prop 作业

但如果只是把

b.工作 = "什么都没有";

变量 C 没有道具"作业"

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

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

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

实例函数 你好

第二种情况应该应用于父"类"(altough js 没有类)在这种情况下 WhateverService

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

原型功能 你好

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