“在Javascript中,Constructor是对象的Class, prototype更像是Parent Class。”
我在之前的一篇文章里这么写的, 现在看来理解还是肤浅,自己应用实践,特别是研究过jQuery和Angualr框架后,对Js对象编程的理解更深入了。js中的prototype不是parent class, 它比parent class更加灵活,在C#/Java中, 没有办法通过改变父类的某一属性而影响曾经创建的所有子类对象,而js可以做到,通过:a.prototype.attr = ''; 所有拥有该prototype的对象的attr都会更新。
prototype是对象间共有的一个原型对象,但是子类对象如果直接操作:a.aatr = '123'; 那改变就仅限于a对象内部,不会影响prototype,这和C#/Java一样。这就好像原来是共有的一份数据,如果需要做出个别的改变的话,就从共有数据备份出一份到个别对象中。
此外,如果prototype是父类,怎么能访问子类对象的this指针呢,父类对象访问子类对象自定义属性在一些高级语言中就是不可能的事情。但是这种例子在Js实践中随处可见, 模式如下:
var consturctorFunction = function(attr){
this.attr = attr;
}
consturctorFunction.Prototype = {
mem: function(){
this.attr = '456'; //prototype操作this指针,指向consturctorFunction所创建对象
}
}
实践中是用prototype来模拟对象公共的函数和属性,实现class机制,而不是parent class!可见理论与实践真是两回事,特别Js就是一门实践型语言!
最后,《Javascript 面向对象与继承_阮一峰》 完全比不上《 W3Shool的教程》实用!
近期评论