原型的目的是什么?

Qui*_*ike 222 javascript prototype-programming

可能重复:
了解JavaScript中的原型继承

好的,所以我对JS中的OOP概念有些新意.

这两个代码片段之间有什么区别:

function animal(){
    this.name = 'rover';
    this.set_name = function(name){
         this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)
function animal(){
    this.name = 'rover';
}
animal.prototype.set_name = function(name){
    this.name = name;
}
Run Code Online (Sandbox Code Playgroud)

他们都做同样的事情,那有什么区别?

Ada*_*kis 316

使用原型可以更快地创建对象,因为每次创建新对象时都不必重新创建该函数.

当你这样做:

function animal(){
    this.name = 'rover';
    this.set_name = function(name){
         this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

每次创建动物时都会从头set_name创建该功能.但是当你这样做的时候

animal.prototype.set_name = function(name){
    this.name = name;
}
Run Code Online (Sandbox Code Playgroud)

每次都不需要重新创建该功能; 它存在于原型的一个地方.所以,当你打电话someAnimal.set_name("Ubu");this情况下将被设置为someAnimal和(独一无二的)set_name函数将被调用.


使用第一种语法有一个好处:以这种方式创建的函数可以访问私有数据:

function animal(){
    var privateData = 'foo'

    this.name = 'rover';
    this.set_name = function(name){
         this.name = name;
         alert(privateData); //will alert 'foo'
    }
}
Run Code Online (Sandbox Code Playgroud)

道格拉斯·克罗克福德(Douglas Crockford)将这种"特权"创建的函数称为"特权":他们可以访问公共数据和私有数据.


小智 33

从这些函数创建新对象时会出现差异

var animal1 = new animal();
Run Code Online (Sandbox Code Playgroud)

由第一函数创建的所有对象都会有不同的nameset_name特性.但是,第二个函数创建的所有对象都将共享该set_name属性.


hug*_*omg 23

在第一个示例中,每个单独的动物都有自己的set_name函数属性,而在第二个示例中,它们通过原型共享相同的函数.

第一个版本的优点是方法可以访问构造函数内声明的本地(私有)变量.

第二种方法的优点是它需要更少的内存(因为你只存储一次方法而不是一百万次),并且在当前的JS引擎中更具性能.

使用第二种方法,您还可以以同样影响已创建实例的方式修改或添加方法.