Javascript OOP和继承技术

时间:2012-12-13 05:32:08

标签: javascript oop

  

可能重复:
  Preserving a reference to “this” in JavaScript prototype functions

我不擅长英语。请理解

当我的朋友有javascript oop工具

function Item (a, b, c) {
    var _a = a, _b = b, _c = c;

    return {
        init: function () {
            ...
        },
        start: function () {
            ....
        }
    }
}
var item = new Item();
item.init();
item.start();

但我想知道以下内容。

function Item (a, b, c) {
    this.a = a, this.b = b, this.c = c;
}

Item.prototype.init = function () {...}
Item.prototype.start = function () {...}
var item = new Item();
item.init();
item.start();

你认为你是谁?

2 个答案:

答案 0 :(得分:1)

他们有一些差异。在第一种情况下:

function Item (a, b, c) {
    var _a = a, _b = b, _c = c;

不需要第二行,abc已经是闭包中保存的局部变量,因此模拟私有变量。它可以写成:

function Item (_a, _b, _c) {

正如其他人所指出的那样,应该在没有new的情况下调用它。

在第二个:

function Item (a, b, c) {
    this.a = a, this.b = b, this.c = c;

新对象将包含公开abc属性。它只取决于您的要求是否需要私人成员(罕见)或需要继承(这是相当常见的)。通常单个单元就足够了,因此普通对象可以使用第一个模式。

module pattern开发的Richard Cornford et al只有很短的一步,并由Douglas Crockford推广。

答案 1 :(得分:1)

<强>参数

你的朋友:

为什么将params重新分配给'_'版本?这些参数用于所有意图和目的,我知道与本地var相同的东西。

此致:

为什么您觉得需要公开这些参数?如果这些值仅对对象实例有影响,则它们应保留在本地变量中。只要对象存在,它们就会存在,而不必是属性。

<强>原型

为什么在这里使用原型?有很多好的理由,但我首先使用this.method,因为它可以访问构造函数中定义的局部变量。原型方法不能。

新功能(){}与{}

我主要为仅数据保留{}对象,或者简单的结构类型对象,它们是比正确的OOP结构更多的实用程序方法集合。但是一旦我在建模需要维护状态的东西,我通常会使用函数构造函数:

var sleepyInstance = new function(){
    var activeState = true;

    this.sleep = function(){
        activeState = false;
    }

    this.doSomething = function(){
        if(activeState){ alert ('did something!'); }
        else { alert('ZZZZZzzz'); }
    }

}

Prototype更适用于对象工厂,使用'this'覆盖默认原型方法和继承。如果您不确定某个房产是否需要曝光,请将其变为var。如果您不确定为什么要使用原型,只需将方法直接附加到带有'this'的实例。原型通常以不同方式构建类似对象最有意义。