分子函数,Javascript的持续是行使原型链的技巧

2019-11-22 05:15 来源:未知

Javascript开发笔记:不完整的继承,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中“成员变量”是对象时,不修改“成员变量”的本身,而是修改“成员变量”对象的成员时,修改的“成员变量”对象的成员就会被所有对象实例共享,这样就违背类设计的初衷。
例如:

图片 1

'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不存在

图片 2

 

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

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

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

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

Javascript的继承和标准的oop继承有很大的区别,Javascript的继承是采用原型链的技术, 每个...

javascript教程之不完整的继承

 Javascript的继承和标准的oop继承有很大的区别,Javascript的继承是采用原型链的技术,下面使用示例学习一下JS的继承

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 定义的“成员变量”(其本身是对象)中的成员,只是只读成员,切记不可赋值,否则会在各个实例中共享。

 

Javascript的继承和标准的oop继承有很大的区别,Javascript的继承是采用原型链的技术,下面使用示例学习一下JS的...

TAG标签:
版权声明:本文由凯时国际ag下载发布于技术核心,转载请注明出处:分子函数,Javascript的持续是行使原型链的技巧