zoukankan      html  css  js  c++  java
  • Javascript开发笔记:不完整的继承

    Javascript的继承和标准的oop继承有很大的区别,Javascript的继承是采用原型链的技术,
    每个类都会将“成员变量”和“成员函数”放到 prototype 上,Js++都过superclass将其链接起来
    即 C.prototype.superclass = C.superclass = P.prototype;
    当 var c = new C()时,c.__proto__ = C.prototype ;
    当 c访问“成员变量”时,如果在__proto__无法获取时,就会到C.prototype查找,如果又不存在,又会到父类的prototype查找,由于只有 __proto__ 是对象创建时分配的(每个对象独立分配),其他都是定义时分配的(每个对象共享),此时,如果访问C.prototype中“成员变量”是对象时,不修改“成员变量”的本身,而是修改“成员变量”对象的成员时,修改的“成员变量”对象的成员就会被所有对象实例共享,这样就违背类设计的初衷。
    例如:

    'package'.j(function () {
            'class A'.j(function () {
                jpublic({
                    v:{a: 1}
                });
                jprivate({
                    p:{a:1}
                });
                jprotected({
                    x:{a:1}
                });
    
            });
    
            'class B extends A'.j(function () {
    
            });
    });
    
    var b1 = new B();
    b1.v.a = 5;
    b1.x.a = 5;
    var b2 = new B();
    
    console.log(b1.v.a) // 输出为 5
    console.log(b1.x.a) // 输出为 5
    
    console.log(b2.v.a) // 输出也为 5,并不是预想的 1
    console.log(b2.x.a) // 输出为 1
    console.log(b2.p.a) // 不可用,会提示 p不存在

    如何解决此问题了?
    A. 将 v 这样的成员“成员变量”(其本身是对象)不在原型链上定义,而是在构造函数中调用,此时,创建对象实例时,就会在对象的__proto__上分配。

    Js++提供了类似的方法,只要在jprivate中定义的“成员变量”或“成员函数”都会分配到对象的__proto__上,且只有本实例可用, jprotected中定义的“成员变量”(其本身是对象)也会分配到对象的__proto__上,且只有继承他的可用,

    B. 原型链上只定义只读的“成员变量”(其本身是对象)

    C.jpublic 定义的“成员变量”(其本身是对象)中的成员,只是只读成员,切记不可赋值,否则会在各个实例中共享。

  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/ranzige/p/javascript_jicheng.html
Copyright © 2011-2022 走看看