var class1 = function () { this.num =1; }; class1.prototype = { add: function (x, y) { return x + y; }, subtract: function (x, y) { return x - y; } }; var class1_1 = function () { this.num1 = 2; }; class1_1.prototype = new class1(); var o1 = new class1_1(); var o2 = new class1_1(); o1.num = 100; alert(o2.num); alert(o1.num);
首先提出一个问题。
class1_1 的原型 继承自 class1的实例.
这里是在 原文中看到的。 link
我们可以看到Calculator的原型是指向到BaseCalculator的一个实例上,目的是让Calculator集成它的 add(x,y)和subtract(x,y)这2个function,还有一点要说的是,由于它的原型是BaseCalculator的一个实例,所以 不管你创建多少个Calculator对象实例,他们的原型指向的都是同一个实例。
因为他的原型就指向一个实例。 所以我以为上面的代码的结果会是 100,100
但是实际结果是 1,100.. 这个让我有点儿不解.
这种继承方式也有一些小问题。 比如不想让子类 访问属性
var class1_1 = function () { this.num1 = 2; }; class1_1.prototype = class1.prototype;
这样 你会发现 class1_1.num 报错.
原型链
function (cbase,c1,override) { if(typeof (cbase)!='function') return; c1.prototype=new cbase(); c1.prototype.constructor=c1; if(!override) return; var c11=c1.prototype; for(var x in override) { c11[x]=override[x]; } },
看了 那篇文章 才知道 自己早已用过原型链. 后面加了一个重载的操作。
文章后面提到了。hasOwnProperty。 其实之前遇见过这个问题
有些时候 修改原型是很方便的方法. 但是在 for in 遍历中 往往就会出现问题。
之前的解决方法是 不要修改原型。 或者说 不要去修改原生对象的原型。
然后专门建立帮助类。 比如 ObjHelp = {}; 需要用到的方法 放在里面
当然。
for(var i in foo) { if (foo.hasOwnProperty(i)) { console.log(i); } }
用这个方法 一步就搞定了。
最后 原文地址