javascript教程之不完整的继承(js原型链)

 更新时间:2014年01月13日 10:33:38   投稿:zxhpj  
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的React框架入门教程

    超级给力的JavaScript的React框架入门教程

    这篇文章主要介绍了JavaScript的React框架入门教程,目前React框架正被Facebook开源极力推广中,此文强烈推荐!需要的朋友可以参考下
    2015-07-07
  • JavaScript实现的GBK、UTF8字符串实际长度计算函数

    JavaScript实现的GBK、UTF8字符串实际长度计算函数

    这篇文章主要介绍了JavaScript实现的GBK、UTF8字符串实际长度计算函数,需要的朋友可以参考下
    2014-08-08
  • JavaScript中的分号插入机制详细介绍

    JavaScript中的分号插入机制详细介绍

    这篇文章主要介绍了JavaScript中的分号插入机制详细介绍,本文讲解JavaScript中各种情况下的分号插入机制,需要的朋友可以参考下
    2015-02-02
  • Javascript的闭包详解

    Javascript的闭包详解

    这篇文章主要介绍了Javascript的闭包详解,需要的朋友可以参考下
    2014-12-12
  • Javascript 学习笔记之 对象篇(二) : 原型对象

    Javascript 学习笔记之 对象篇(二) : 原型对象

    Javascript 并没有类继承模型,而是使用原型对象 prototype 进行原型式继承。尽管人们经常将此看做是 Javascript 的一个缺点,然而事实上,原型式继承比传统的类继承模型要更加强大。举个例子,在原型式继承顶端构建一个类模型很简单,然而反过来则是个困难得多的任务。
    2014-06-06
  • Javascript入门学习第六篇 js DOM编程

    Javascript入门学习第六篇 js DOM编程

    上篇文章纳闷的问题,将在这章和以后的几章里,慢慢搞定。 从今天起,开始学习DOM编程 让我们慢慢称为一名初级的js程序员。 然后往js匠人方向发展。
    2008-07-07
  • JS中switch的四种写法示例

    JS中switch的四种写法示例

    这篇文章主要为大家介绍了JS中switch的四种写法示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • javascript数组详解

    javascript数组详解

    数组对象用来在单独的变量名中存储一系列的值。我们使用关键词 new 来创建数组对象。有两种向数组赋值的方法,也可以使用一个整数自变量来控制数组的容量
    2014-10-10
  • JavaScript mapreduce工作原理简析

    JavaScript mapreduce工作原理简析

    MapReduce是一个编程模型,用于作业调度,也是一个处理和生成超大数据集的算法模型的相关实现,本文将详细介绍JavaScript mapreduce工作原理,需要的朋友可以参考下
    2012-11-11
  • 深入document.write()与HTML4.01的非成对标签的详解

    深入document.write()与HTML4.01的非成对标签的详解

    本篇文章对document.write()与HTML4.01的非成对标签进行了详细的分析介绍。需要的朋友参考下
    2013-05-05

最新评论