用简单的术语定义函数原型上的方法意味着您已经在对象上定义了一个方法,该方法将成为该函数所有实例的原型链的一个链接。
您可以将其视为该函数的每个实例的通用“父级”或“上方对象”。
因此,要使用您的方法,您必须实例化插件并在其上调用您的函数。
function Pikaday() {}
Pikaday.prototype = {
showYearPicker: function() {
console.log('called');
}
}
let pikaday = new Pikaday();
pikaday.showYearPicker(); // <-- call the function on the prototype
这将做的是检查是否pikaday
已经showYearPicker
定义了它,因为它没有,它会沿着原型链向上并检查该对象是否有它,它确实如此。
换句话说,这本质上是 JS 引擎在幕后所做的:
let pikaday = new Pikaday();
pikaday.__proto__.showYearPicker();
请注意,这里的proto只是为了演示,它最近才在 ES6 中标准化以用于遗留目的,但是这种行为应该留给 JS 引擎(规范称为这个 proto 链接[[Prototype]]
)。
如果需要,访问原型的正确方法是使用Object.getPrototypeOf(在 +ES6 中,您可以使用语义更清晰的Reflect.getPrototypeOf)
function Pikaday() {}
console.log(
Object.getPrototypeOf(new Pikaday()) === Pikaday.prototype
);
console.log(
Reflect.getPrototypeOf(new Pikaday()) === Pikaday.prototype
);
您的代码的一个问题是getElementsByClassName将返回具有此类的节点的NodeList(不是数组)。
这意味着您必须遍历此列表并将处理程序附加到每个元素,
let nodes = document.getElementsByClassName('pika-year-label');
Array.from(nodes) // convert NodeList to an array so we can use forEach
.forEach(node => {
// attach a handler on each node
node.onclick = function (){
console.log("asfd");
}
});
// Side Note: You can also use array spread to convert the node list to an array
// [...nodes].forEach( ... )
或者将处理程序附加到所有元素的公共父级以委托行为。
document.body.onclick = function(e) {
if (e.target.classList.contains('pika-year-label')) {
console.log("asfd");
}
}
最后,如果您只想将此函数添加到现有函数的原型中,一种方法是将其简单地定义为该原型上的方法:
function Pikaday() {}
// define a method on the existing prototype
Pikaday.prototype.showYearPicker = function() {
console.log('called');
};
let pikaday = new Pikaday();
pikaday.showYearPicker(); // <-- call the function on the prototype