你不想使用Object.prototype.sayHi = function(){}
的原因是,一旦你做了,其原型鏈中的所有Object
將能夠使用sayHi
。這是原型繼承的核心。
將物品添加到您創建的對象原型中(向Object.prototype
添加它只是被認爲是不好的做法)。要明白,當你這樣做時,你的對象原型鏈中的任何東西都能夠使用該功能。
function sayHello() {
console.log("hello");
}
// Bad
Object.prototype.hello = sayHello;
Date.hello(); // Prints hello
呼叫,應用,綁定實際上是從添加到原型和綁定也從不同的電話及應用,以及略有不同。
呼叫和應用
Function.call()
和Function.apply()
使用任何功能,您所呼叫或在通話或應用瞬間申請。
例如,如果我們想用呼叫之間的NodeList
var els = document.querySelectorAll("div");
Array.prototype.forEach.call(els, function(el){
el.classList.add("someClass");
很大的區別的forEach()
方法和應用是call
需要一個可變參數的參數和apply
需要一個數組。
function say() {
console.log(arguments);
}
say.call(this, "a", "b");
say.apply(this, ["a", "b"]);
綁定
使用Function.bind()
實際上是雖然不同的事情。綁定允許您創建一個上下文綁定,您可以根據需要從特定的上下文中調用某個函數。
function honk() {
console.log(this.sound);
}
function Car() {
this.sound = "honk";
}
function Van(){
this.sound = "beep";
}
var c = new Car();
var v = new Van();
var ftorCar = honk.bind(c);
var ftorVan = honk.bind(v);
ftorCar(); // prints honk
ftorVan(); // prints beep
您現在可以通過ftorCar
周圍,並調用它,當你想它會有正確的範圍「綁定」。
這是不好的做法,特別是修改Object.prototype。 'user.sayHello = function(){}'或'function sayHello(obj){}'怎麼樣? – elclanrs
通過在'Object.prototype'中添加'sayHi',幾乎所有東西都有'sayHi'方法。 – zero298
您不應該觸摸Object.prototype。否則,所有對象都會繼承此方法。 'new Date()。sayHi()','window.sayHi()','/\d/.sayHi()' ... – dfsq