精通JavaScript第三章:创建可重用的代码(继承)
其他参考: javascript碎碎念(面向对象备忘)
原型式继承
这个我们已经说过很多次了
书本的解释是
我是这么理解的。
new Pserson() 返回一个Person的实例。该对象的实例当然能够访问Pserson对象所有的公开方法啦。
然后呢, User.prototype=这个实例,相当于循环了Person内所有的公开方法,
for (var i in Person.prototype) {
User.prototype[i] = Person.prototype[i];
}
/*ps:什么是Person.prototype对象?
prototype提供了一群同类对象共享属性和方法的机制
它的值(也是一个对象)所包含的所有属性
也就是说, 他就是一个json类型的对象(胡说的,不过确实可以像json一样循环读取,偶就这么理解吧)
*/
因此, New User 所返回的对象,自然能够直接访问User对象下的方法以及Person对象下的方法啦。
类式继承
这段比较难懂, 我也不说了。自己都看得迷迷糊糊
. //辅助函数, 可以将新函数绑定到对象的prototype实现扩展
Function.prototype.method = function(name, func) {
this.prototype[name] = func;
return this;
}
Function.method('inherits', function(parent) {
var depth = 0;//记录我们目前所在父层次的级数
var proto = this.prototype = new parent(); //继承父对象的方法
//创建一个新的名味uber的"特权函数"(笔者注: 就是动态添加的函数, 我觉得有点故弄玄虚)功能很复杂
this.method('uber', function uber(name) {
var func;
var ret;
var v = parent.prototype;
if (depth) {
for (var i = d; i > 0; i += 1) {
v = v.constructor.prototype;
}
func = v[name];
} else {
func = proto[name];
if (func = this[name]) {
func = v[name];
}
}
depth += 1;
ret = func.apply(this, Array.prototype.slice(arguments, [1]));
depth -= 1;
return ret;
})
});
//只继承父对象特定函数的函数,而fei使用new parent 继承所有函数!
//笔者注: 这个就很有味了. 相当于我们上面所说的用循环获得对象的函数, 在循环中只取得一些函数
Function.method('swiss', function(parent) {
for (var i = 1; i < arguments.length; i += 1) {
var name = arguments[i];
this.prototype[name] = parent.prototype[name];
}
return this;
});
function Person(name) {
this.name = name;
}
Person.method('getName', function() { return name; });
function User(name, password) {
this.name = name;
this.password = password;
}
User.inherits(Person);//从Person继承所有函数
User.method('getPassword', function() { return this.password; });//扩展一个getPassword的函数
//再次扩展一个. 不过通过uber函数来调用父亲的方法,而不是自己的方法
User.method('getName', function() { return "My Name is :" + this.uber('getName'); });
var u = new User();
u.getName();
这样就实现了 继承,多肽和抽象了。~
本人在长沙, 有工作可以加我QQ4658276