在Javascript中使用Prototype有什么好处?

时间:2012-01-20 11:39:06

标签: javascript prototypal-inheritance

我在Javascript中阅读了私人成员http://javascript.crockford.com/private.html上的crockford页面,并得到了一个可能有些相关的问题。开发人员为什么要使用Prototype?

例如,

例如,我可以这样做

var Foo = new Object();
Foo.bar = function() { alert('Its a bar'); };
var x = Foo;
x.bar();

而不是

var Foo = function(){};
Foo.prototype.bar = function(){alert('Its a bar');};
var x = new Foo();
x.bar();

这两个实现都做同样的事情。一个人与另一个人有什么不同?这会以任何方式影响继承吗?

1 个答案:

答案 0 :(得分:3)

使用原型模式时,只存在一个添加到原型的属性实例。

// Lets create 1000 functions which do the same thing
for (var i=0;i<1000;i++) {
    Foo = new Object();
    Foo.bar = function() { alert('Its a bar'); };

    var x = Foo;
    x.bar();
}

// This is the same as #1, but is more common
function Foo() {
    this.bar = function () { alert('It\'s a bar'); };
}
for (var i=0;i<1000;i++) {
    var x = new Foo;
    x.bar();
}

// Lets create 1 function
var Foo = function(){};
Foo.prototype.bar = function(){alert('Its a bar');};
for (var i=0;i<1000;i++) {
    var x = new Foo();
    x.bar();
}

原型模式的缺点无法访问私有成员。

// Lets create 1 function
var Foo = function(){
    var private = 4;

    this.baz = function () {
        alert(private);
    }
};
Foo.prototype.bar = function(){alert(private);};

var x = new foo;
x.bar(); // error; `private` is undefined
x.baz(); // ok