这些Javascript函数声明中的差异
今天我看到了两种不同类型的Javascript函数声明,我想对这两种有更深入的了解:这些Javascript函数声明中的差异,javascript,Javascript,今天我看到了两种不同类型的Javascript函数声明,我想对这两种有更深入的了解: function Car( model, year, miles ){ this.model = model; this.year = year; this.miles = miles; } /* Note here that we are using Object.prototype.newMethod rather than Object.prototype so as t
function Car( model, year, miles ){
this.model = model;
this.year = year;
this.miles = miles;
}
/*
Note here that we are using Object.prototype.newMethod rather than
Object.prototype so as to avoid redefining the prototype object
*/
Car.prototype.toString = function(){
return this.model + " has done " + this.miles + " miles";
};
var civic = new Car( "Honda Civic", 2009, 20000);
var mondeo = new Car( "Ford Mondeo", 2010, 5000);
console.log(civic.toString());
和类型2:
function Car( model, year, miles ){
this.model = model;
this.year = year;
this.miles = miles;
this.toString = function(){
return this.model + " has done " + this.miles + " miles";
};
}
var civic = new Car( "Honda Civic", 2009, 20000);
var mondeo = new Car( "Ford Mondeo", 2010, 5000);
console.log(civic.toString());
特别是“原型”和“this.toString”
任何人都可以传授一些JS智慧吗?
这个。toString必须在构造函数中定义,并且只能在Car类中找到,不能从它继承任何东西(除非特别包括在子类中)
Car.prototype.toString
可以在构造函数之外定义,并且可以在继承自Car类的任何类的原型上找到。此.toString必须在构造函数中定义,并且只能在Car类上找到,而不能在继承自它的任何对象上找到(除非特别包括在儿童课程中)
Car.prototype.toString
可以在构造函数之外定义,并且可以在继承自Car类的任何类的原型上找到。这里的主要区别是,在方法2中,您使用创建的每个新的Car实例重新定义方法,这在技术上性能较差
然而,方法2提供给您的一件好事是,您可以创建真正私有的实例变量,如下所示:
function Person( _age ){
var age = _age;
this.canDrink = function(){
return age >= 21;
}
}
var p = new Person(25);
p.canDrink() // true
p.age // undefined, because age is not exposed directly
方法1的另一个优点(除了性能)是,您现在可以更改对象上所有实例的功能。例如:
function Person( _age ){
this.age = _age;
}
Person.prototype.canDrink = function(){
return this.age >= 21;
}
var a = new Person(15),
b = new Person(25);
a.canDrink() // false
b.canDrink() // true
Person.prototype.canDrink = function(){ return true }
a.canDrink() // true
b.canDrink() // true
对于方法2,这是不可能的(不针对每个实例进行更改)。但是,年龄现在已公开:
a.age // 15
b.age // 25
这里的主要区别是,在方法2中,您正在使用您创建的每个新汽车实例重新定义该方法,这在技术上性能较差
然而,方法2提供给您的一件好事是,您可以创建真正私有的实例变量,如下所示:
function Person( _age ){
var age = _age;
this.canDrink = function(){
return age >= 21;
}
}
var p = new Person(25);
p.canDrink() // true
p.age // undefined, because age is not exposed directly
方法1的另一个优点(除了性能)是,您现在可以更改对象上所有实例的功能。例如:
function Person( _age ){
this.age = _age;
}
Person.prototype.canDrink = function(){
return this.age >= 21;
}
var a = new Person(15),
b = new Person(25);
a.canDrink() // false
b.canDrink() // true
Person.prototype.canDrink = function(){ return true }
a.canDrink() // true
b.canDrink() // true
对于方法2,这是不可能的(不针对每个实例进行更改)。但是,年龄现在已公开:
a.age // 15
b.age // 25
这取决于你所说的继承是什么意思,因为Javascript没有继承标准。我通常使用继承的方式,this.toString()
是继承的。真的,真的。这更类似于经典继承(虽然不是真的:p),而我说的是原型继承。你的意思是Corvette.prototype=new Car();
?我做Corvette.prototype=new Car();Corvette.prototype.constructor=Corvette;
。这似乎是一种非常有效的继承方法。你也可以做类似Car.extend(Corvette)的事情
,如果我没记错语法的话。这也很有效,引导起来也很有效。哦,没错。我知道我在什么地方读过这篇文章,但我没有把它归因于jQuery。你的方法很好,我实际上也做了类似的事情。这取决于你所说的继承是什么意思,因为Javascript没有继承标准。这是我通常使用的方法继承,this.toString()
是继承的。真的,真的。这更类似于经典继承(虽然不是真的:p),而我说的是原型继承。你的意思是Corvette.prototype=new Car();
?我是Corvette.prototype=new Car();Corvette.prototype.constructor=Corvette;
。这似乎是一种非常有效的继承方法。您还可以执行类似于Car.extend(Corvette)的操作;
,如果我没记错语法的话。这也很有效,引导起来也很有效。哦,没错。我知道我在什么地方读过,但我没有把它归因于jQuery。你的方法很好,我实际上做了类似的事情。可能重复的可能重复的