Javascript OOP和继承技术

时间:2011-08-11 07:23:48

标签: javascript oop inheritance

我正在参加我在秋季学习的第一堂OOP课程(学习Java),所以我一直在阅读它并通过一些语言介绍让自己在上学前认识。我很高兴学习Java,但觉得我在JavaScript中更“在家”。我已经用它完成了一些项目,并且正在努力通过在JS中使用OOP将我的代码带到下一个更专业的级别(如果你想这么说)。

目前我正在研究拖动脚本,并且已经将程序编程固定下来了。由于这个项目在我的记忆中是新鲜的,我从这个项目开始我开始移动到对象。让我感到震惊的是拥有一个“拖动”对象的想法。 。

function Drag() {
    /* Drag code goes here */
} // constructor

我对OOP的想法相当不错,但这让我很难过。在我经历的所有例子中,对象总是,对象。他们是动物或汽车,或自行车等。我还没有遇到行为的对象。我只是不确定它是如何工作的。 。 。如果您对此有任何建议,我会很感激。

现在继承!我还没有必要使用继承,但这个主题让我感兴趣的是JavaScript,因为有很多人把它们放在2美分左右。我认为,我见过的最流行的方式是John Resig'sDouglas Crockford's继承方式。

我认为它们是非常简洁的解决方法,但出于某种原因我并不喜欢它们都需要分配。我想我觉得他们不应该那样工作。所以,在看了一些更多的例子和Crockford的方法之后,我想出了这个(非常抱歉,如果其他人已经拥有,我只是没有看到它):

Object.prototype.extend = function (Obj) {
    'use strict'; // for jslint

    this.prototype = new Obj();
    this.prototype.constructor = this;
    return this;
}

下面是一个使用它的示例,我从here偷了示例,然后稍微修改了一下:

Object.prototype.inObj = 1;

function A() {
    'use strict';
    this.inA = 2;
}

A.prototype.inAProto = 3;

function B() {
    'use strict';
    this.inB = 4;
}

/*** HERE IT IS ***/
B.extend(A);

B.prototype.inBProto = 5;

var w = new A();
var x = new B();

document.body.innerHTML = x.inObj + ', ' + x.inA + ', ' + x.inAProto + ', ' + x.inB + ', ' + x.inBProto; // 1, 2, 3, 4, 5
document.body.innerHTML += '<br />';
document.body.innerHTML += w instanceof A && w instanceof Object && x instanceof B && x instanceof A && x instanceof Object; // true

对我来说,它的外观和感觉语法都很好,我想知道经验丰富的JS开发人员会对它感觉如何。我对其进行了测试,并且我知道您可以将B.extend(A)放在B的定义之前,但是您不能将其放在B.prototype.inBProto之后,或者列表将变为1,2,3,4,未定义因为在extend方法中,B的原型正在被重置。我正在努力解决这个问题,但感觉B.extend(A)应该直接在构造函数的定义之后。

你们都这么想?提前谢谢!

编辑:我开发了一种[笨拙]的解决方法,它基本上采用了继承对象原型的所有属性,然后在新对象擦除之后重新添加它们:

Object.prototype.extend = function (Obj) {
    'use strict';
    var proto, p;

    proto = {};
    for (p in this.prototype) {
        if (this.prototype.hasOwnProperty(p)) {
            proto[p] = this.prototype[p];
        }
    }

    this.prototype = new Obj();
    this.prototype.constructor = this;

    for (p in proto) {
        if (proto.hasOwnProperty(p)) {
            this.prototype[p] = proto[p];
        }
    }

    return this;
};

谁知道,也许你不会认为这和我一样笨拙,但是它有效并且我认为这很酷! :D

1 个答案:

答案 0 :(得分:2)

我同意丹尼尔,你永远不应该扩展基本的JS核心。

我可以打破的原因是其他人可能也做过同样的事情。但它更多的是不改变核心代码的默认行为。

我会使用不同的方法。而是扩展Object使其成为一个函数并使用apply

制作一个简单的模型:http://jsfiddle.net/djEw8/

请阅读此处的申请:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply

相关问题