调用/绑定/应用vs原型

时间:2016-03-03 16:57:40

标签: javascript prototype call bind apply

在以下代码中:

function User(name) {
    this.name = name;
}

var user = new User('Jason Bourne');

User.prototype.sayHi = function() {
    return 'Hi ' + this.name;
};

var sayHello = function() {
    return 'Hello ' + this.name;
};

如果我将对象绑定到sayHello(sayHello.bind(user))或者我使用user.sayHi();

,这两个函数都会给我相同的结果

所以我的问题是,是否有理由使用一种方法而不是另一种方法?我以为我已经读到了某个地方,不鼓励在原型上创造东西,如果是这样的话,为什么呢?

<击>的 CORRECTION:

<击>

我错误地写了Object.prototype ..而不是指定(Object I create).prototype ..

2 个答案:

答案 0 :(得分:2)

您不想使用for k = 1 : size(allFrames,4) imshow(allFrames(:,:,:,k)); pause; end 的原因是,一旦您这样做,原型链中Object.prototype.sayHi = function(){}的所有内容都将能够使用Object。这是原型继承的核心。

可以将内容添加到创建的对象的原型中(并且它被认为是添加到sayHi的不良做法)。只要明白,当你这样做时,对象原型链中的任何东西都能够使用该函数。

Object.prototype

Call,Apply和Bind实际上与添加到原型略有不同,Bind也与Call和Apply不同。

致电并申请

Function.call()Function.apply()会在通话或申请时使用您正在呼叫或申请的任何功能。

例如,如果我们想在function sayHello() { console.log("hello"); } // Bad Object.prototype.hello = sayHello; Date.hello(); // Prints hello

上使用forEach()方法
NodeList

call和apply之间的最大区别是var els = document.querySelectorAll("div"); Array.prototype.forEach.call(els, function(el){ el.classList.add("someClass"); 采用可变参数,call采用数组。

apply

绑定

使用Function.bind()实际上是另一回事。 Bind允许您创建上下文绑定,您可以在需要时从特定上下文中调用函数。

function say() {
    console.log(arguments);
}
say.call(this, "a", "b");
say.apply(this, ["a", "b"]);

您现在可以传递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 并在需要时调用它,它将具有正确的范围“绑定”。

答案 1 :(得分:0)

修改Object.prototype非常糟糕,因为每个对象都从它继承,因此现在创建的每个对象都会有一个名为sayHi的方法,甚至是没有属性名的对象。

如果您要创建自己的类说,可以将sayHi方法添加到原型列表中,因为那时只有该类型的实例将具有该方法:

function Person(name){
   this.name = name;
}

Person.prototype.sayHi = function() { return 'Hi ' + this.name; }

至于选择这种或那种方式,我会说它主要是偏好。我倾向于使用原型来创建我在内部范围内使用这些原型创建和运行的对象。