我有一个名为Observable
的函数。对于所有函数,我可以调用函数上的某些方法,即使它们不直接存在于函数上,JS 也会“沿着原型(prototype)链”移动并获取函数上的方法。此类方法的示例是“toString()
”
function Observable(forEachy) {
this._forEachy = forEachy;
}
console.log(Observable.toString()) // "function Observable(forEach) {this._forEach = forEach;}"
现在,当我将 Observable.prototype
设置为一个新对象并在该对象中定义一些方法,并在 Observable
上调用这些方法时,它会引发错误。
Observable.prototype = {
forEachy: function (onNext) {
return onNext();
}
}
console.log(Observable.forEachy(()=>"Hi, John")) // error: Observable.forEachy is not a function
但我可以在原型(prototype)上调用这些方法,而且效果很好。
console.log(Observable.prototype.forEachy(()=>"Hi, John")); // "Hi, John"
将一个新实例设置为 Observable 就可以正常工作。
const abc = new Observable("HI");
console.log(abc.forEachy(()=>"Hello world")); // "Hello world"
请问这是为什么?
此外,除了将构造函数中收到的参数传递给新创建的对象之外,语句 this._forEachy = forEachy
还做了什么?
const abc = new Observable("HI");
console.log(abc._forEachy) // "HI"
最佳答案
您的示例按预期工作。您应该考虑获取有关 JavaScript 中的原型(prototype)的更多信息。
当您将某些内容声明为 Function.prototype = function(){}
时,它的工作方式类似于 OOP 编程中的方法。在oop中你不能调用Class.method(),可以吗?您必须首先创建一个实例才能调用此方法。但是,请记住,OOP 和原型(prototype)继承之间存在很多差异。事实上,你的“原型(prototype)”并不是抽象的。这是现有的对象:)
但是,如果您想遵循这种方式,您可以创建类
并定义静态方法
:
class Observable {
static forEachy(){
// your code here
}
}
然后:
Observable.forEachy()
关于javascript - 函数原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50871079/