这些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

今天我看到了两种不同类型的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 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。你的方法很好,我实际上做了类似的事情。可能重复的可能重复的