精通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();

 

这样就实现了 继承,多肽和抽象了。~

posted @ 2010-04-11 23:06  MyCoolDog  阅读(293)  评论(0编辑  收藏  举报