« 牙牙学语 | 首页 | M.H. »

1w

个人主页: http://uxat.me

留言(5 条)

蛋屋的建造 留言:

我还以为最后一张图会是蛋屋被强制牵走的那张照片...

Javascript面向对象编程(二):构造函数的继承 留言:

不好意思, 上面这样写当遇到数组时是不行的, 参考峰兄的代码, 修改了一下:

var obj = (o.construcotr === Array)?[]:();

Javascript面向对象编程(二):构造函数的继承 留言:

最后一种通过拷贝的方法来实现继承是有问题的. 这里博主用的是浅拷贝的方法, c[i] 是指向到 p[i], 而非赋值, 这样如果改动到 c[i], 会影响到 p[i]. 例如:

function fn1() {};
function fn2() {};
fn2.prototype.arr = [1,2];
var c = fn1.prototype, p = fn2.prototype;
for(var i in p) {c[i] = p[i]};
fn1.prototype.arr.push(3);
fn2.prototype.arr // [1,2,3]

建议用深拷贝的方法来实现:

(function(o) {
if(typeof o != "object") return o;
var obj = {};
for(var p in o) {
obj[p] = arguments.callee(o[p]);
return obj;
}
})();

Javascript面向对象编程(二):构造函数的继承 留言:


引用RedNax的发言:


啊,抱歉想错了。
第5种方法不会增加空类的,那个new F()和new Parent()地位一样,只是不跑构造函数而已。
好方法……


new F() 这里不还是 new 出一个实例么, 按作者的意思, 这里因为是 new 一个空对象, 资源消耗相对较小.

Javascript 面向对象编程(一):封装 留言:


引用axu的发言:


这么一段代码,ruan兄猜猜是啥结果?我觉得这是封装中最容易犯的错误
var a=function(){
//empty
}

a.prototype.var1=[1,2,3];

var b=new a();
b.var1.push(4);

var c=new a();
alert(c.var1.join(","))



这就涉及到对象的继承机制了. 更直白一点, 涉及到 JS 语言的变量赋值与引用的区分.