Javascript调用并应用于构造函数
Javascript call and apply on constructor functions
我明白了在下面的例子中call (and apply) method是如何工作的。
var Bob = {
name: "Bob",
greet: function() {
alert("Hi, I'm " + this.name);
}
}
var Alice = {
name: "Alice",
};
Bob.greet.call(Alice); // Hi, I'm Alice
根据我的理解,上面发生的事情是Bob对象的greet方法在Alice的范围内被调用。
有人能解释一下在下面的例子中,调用方法被用于允许继承的构造函数的幕后发生了什么吗?
function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
var chicken = new Food('chicken','40');
console.log(chicken); //{ name= "chicken", price="40", category="food"}
我不能在第一个和第二个例子之间建立联系,在第一个例子中,call方法是在一个正在做某事的函数上调用的(alert),而在第二个例子中,call方法是在一个初始化一些属性的构造函数上使用的。
这是一种"借用"Product
的构造函数来初始化新的Food
的方法。
当您使用new
调用函数时,您将this
设置为新的实例。然后你做Product.call
(即调用Product
函数并在Product
函数内设置this
作为你的新Food
实例(这是Food
内的this
)),并传递你的name
和price
。
在Product.call(this, name, price);
之后,您应该发现this.name
和this.price
已经设置。
不允许继承,也不允许gain inheritance;它只是在新的Food
实例上执行构造函数Product
。
要获得继承,还必须将Food
的prototype
设置为新的Product
实例;
function Product(name, price) {
this.name = name;
this.price = price;
}
Product.prototype.showPriceIn = function (currency) {
alert(this.price + currency);
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
Food.prototype = new Product;
var chicken = new Food('chicken','40');
chicken.showPriceIn("$");
http://jsfiddle.net/hPWMN/ N。B:注意说"Bob是用Alice的作用域调用的";这不是真的。Bob没有继承Alice的作用域,greet
函数中this
的值仅仅被修改为Alice
。继承这个作用域意味着Bob可以访问私有变量之类的东西,而实际上他并没有。
我将尝试用一个简单的例子来解释,这里是
function Human(name,surname){
this.name = name;
this.surname = surname;
}
Human.prototype.method = function(){
alert("Hi " + this.name + " " + this.surname);
};
var obj = new Human("Name","Surname");
obj.method();
在本例中,Human
是定义属性name和姓氏的构造函数。prototype
函数与method
函数扩展,我使用this
键。它引用从外部定义的指定对象。
对于var obj = new Human("Name","Surname");
,您初始化Human
类并传递值(名称,姓氏)。在本例中,您有一个名为obj
的对象,但您可以定义任意多个
- 将函数的上下文应用于javascript变量
- 文本表示法VS.构造函数,用于在JavaScript中创建对象
- 如何将参数应用于String.prototype.format函数
- 获得“;jvm.Map不是构造函数“;用于jvectormap
- 在Javascript中将函数应用于Null
- 我该如何将onbeforeload函数应用于此javascript
- 将自定义javascript函数应用于iframe元素
- 将 jQuery/JavaScript 函数应用于 jTable 检索的 SQL 数据
- 构造函数中的 JavaScript 函数不适用于 onclick
- 用于初始化对象的编码模式 - 构造函数(新)与 Object.create()(Crockford)
- 将函数应用于 JavaScript 中的对象
- 如何将CSS应用于此jQuery函数的结果
- 将动态参数应用于 JavaScript 函数,但延迟调用
- addClass() 函数未应用于 ID
- 将点击/悬停函数应用于JS中的多个元素类
- 使用Object.keys获取用于创建构造函数实例的属性,然后打印继承的属性
- 如何将jQuery构造函数用于多个类型的html值
- Javascript不能将现有函数应用于onkeyup
- 对象.创建而不是用于继承的构造函数
- JavaScript -将名称空间分配给局部变量以用于构造函数,但不确定发生了什么