我正在参加我在秋季学习的第一堂OOP课程(学习Java),所以我一直在阅读它并通过一些语言介绍让自己在上学前认识。我很高兴学习Java,但觉得我在JavaScript中更“在家”。我已经用它完成了一些项目,并且正在努力通过在JS中使用OOP将我的代码带到下一个更专业的级别(如果你想这么说)。
目前我正在研究拖动脚本,并且已经将程序编程固定下来了。由于这个项目在我的记忆中是新鲜的,我从这个项目开始我开始移动到对象。让我感到震惊的是拥有一个“拖动”对象的想法。 。
function Drag() {
/* Drag code goes here */
} // constructor
我对OOP的想法相当不错,但这让我很难过。在我经历的所有例子中,对象总是,对象。他们是动物或汽车,或自行车等。我还没有遇到行为的对象。我只是不确定它是如何工作的。 。 。如果您对此有任何建议,我会很感激。
现在继承!我还没有必要使用继承,但这个主题让我感兴趣的是JavaScript,因为有很多人把它们放在2美分左右。我认为,我见过的最流行的方式是John Resig's和Douglas 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
答案 0 :(得分:2)
我同意丹尼尔,你永远不应该扩展基本的JS核心。
我可以打破的原因是其他人可能也做过同样的事情。但它更多的是不改变核心代码的默认行为。
我会使用不同的方法。而是扩展Object
使其成为一个函数并使用apply
。
制作一个简单的模型:http://jsfiddle.net/djEw8/
请阅读此处的申请:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply