JavaScript实例函数与原型函数

时间:2009-09-17 20:40:05

标签: javascript syntax prototype-programming

  

可能重复:
  Use of 'prototype' vs. 'this' in Javascript?

我对各种JavaScript函数的理解如下:

function MyObj() {
    this.propOne = true;
    this.publicInstanceFunc = function() {
        if (propOne)
            return 'public instance function';
    }
    function privateFunc() {
        return 'private function only visible inside this constructor';
    }
}

MyObj.prototype.protoFunc = function() {
    if (this.propOne)
        return 'prototype function shared amongst all instances of MyObj';
}
  1. 这些是正确的吗?
  2. 在什么情况下应该将函数放在原型上(例如protoFunc)而不是构造函数(例如publicInstanceFunc)?
  3. 使用this正确的方法来访问原型函数中的属性吗?

4 个答案:

答案 0 :(得分:51)

实际上,您可以通过将整个事物包装在自动执行的函数中来添加另一级别的权限:

var MyObj = (function() { // scoping
    var privateSharedVar = 'foo';

    function privateSharedFunction() {
        // has access to privateSharedVar
        // may also access publicSharedVar via explicit MyObj.prototype
        // can't be called via this
    }

    function MyObj() { // constructor
        var privateInstanceVar = 'bar';
        this.publicInstanceVar = 'baz';

        function privateInstanceFunction() {
            // has access to all vars
            // can't be called via this
        };

        this.publicInstanceMethod = function() {
            // has access to all vars
            // also known as a privileged method
        };
    }

    MyObj.prototype.publicSharedVar = 'quux';

    MyObj.prototype.publicSharedMethod = function() {
        // has access to shared and public vars
        // canonical way for method creation:
        // try to use this as much as possible
    };

    return MyObj;
})();

只能通过this从外部访问“公开”媒体资源。

出于性能原因,你应该避免我所谓的'实例'方法:对于每一个,必须为每个MyObject实例创建一个新的函数对象,而每个'shared'只有一个函数对象方法

答案 1 :(得分:4)

  

这些是正确的吗?

ERR。嗯,这取决于你想做什么。在JavaScript中没有一个可接受的规范模型用于实现类/实例样式的继承。

但是这个:

    if (propOne)

可能是一个错误,因为this.propOne是所有者对象的属性,而propOne本身是一个尚未声明的变量(默认为全局变量,但是通常是错误的。)

  

在什么情况下应该将函数放在原型(例如protoFunc)和构造函数中(例如publicInstanceFunc)?

原型上设置的函数与所有对象共享的功能相同。它能够计算出它所属的实例的唯一方法是在调用它时读取“this”。

构造函数中“this”上设置的函数是MyObj的每个实例的新函数。您可以使用它作为基于闭包而不是'this'绑定到所有者对象的替代方法,这可以节省写出功能绑定的东西。这是一种不同的面向对象风格,通常你不会混淆这种风格。

答案 2 :(得分:3)

1)是的,你的代码是对的。

2)当我想访问构造函数本身范围内私有定义的其他成员时,我使用构造函数中定义的函数,例如,当你想创建privileged methods时。

在构造函数上定义的公共函数比向对象原型添加一个简单函数的计算成本更高,但它们也为您提供了更大的灵活性。

3)是的,如果属性是公共的,您可以使用原型扩展函数中的this关键字来访问它,因为this指的是对象的实例。

答案 3 :(得分:3)

关于第二点,您扩展原型,以便所有已创建的对象都获得新方法。

此外,您还可以向内置对象添加方法(例如将trim()添加到string)。