zoukankan      html  css  js  c++  java
  • 为什么要用prototype

    在prototype继承中 原型类中不能有成员对象! 所有成员必须是值类型数据(string也可以)
    用prototype继承有执行效率高,不会浪费内存,为父类动态添置方法后子类中马上可见等的优点。

    function ClassA() {      this.name = 'A'; }
    
    ClassA.prototype = {     str : "BB",     arr : ['K'] }
    
    实例化:     var a = new ClassA(); var b = new ClassA();
    alert(a.str+ "," + b.str+ "," + a.arr + "," + b.arr); 打印 BB,BB,K,K
    a.name = 'C'; a.arr.pop() alert(a.str+ "," + b.str+ "," + a.arr + "," + b.arr); 打印 C,BB, ,
    View Code


    其实很简单, Function 的 prototype 属性允许所有的function实例共享一组 函数和成员, 我们在使用prototype提供的属性的时候,得到的是属性的引用。

    这也就是为什么a.str改变了,b.str没改变,而a.arr 将内容改写了, b.arr也随之改变的原因。

    a.str只是对prototype里面str的一个引用,a.str = "C", 只是将a的str引用指向了C,并没有改变prototype对象中的str的值。

    而a.arr.pop 切实的修改了arr的内容,由于b也是共享同一个arr内存,因此也变了。

    另外prototype 允许动态的向已经定义好的函数和对象添加属性和方法。现在很多面向对象技术是基于prototype实现的继承。

    遵循简单的原则: 类实例共享的方法写如prototype, 这样节省内存。 成员变量不要放到prototype中,常量也不要放入prototype.

  • 相关阅读:
    软件设计师经验分享
    数据库设计基本规范
    UEditor上传文件的默认地址修改
    mongoDB简单介绍及安装
    链表中倒数第k个结点
    一入python深似海--对象的属性
    stl--vector 操作实现
    android5.x加入sim1,sim2标识
    leetCode 27.Remove Element (删除元素) 解题思路和方法
    java8新增特性(一)---Lambda表达式
  • 原文地址:https://www.cnblogs.com/liqb/p/3487841.html
Copyright © 2011-2022 走看看