zoukankan      html  css  js  c++  java
  • JavaScript原型

    function Person(){}
    Person.prototype.name = 'lzl';
    Person.prototype.showName = function(){
        document.write(this.name);
    }
    
    var p = new Person();
    p.showName();

    上面这段代码使用了原型而不是构造函数初始化对象。这样做与直接在构造函数内定义属性有什么不同呢?

      ☞ 构造函数内定义的属性继承方式与原型不同,子对象需要显式调用父对象才能继承构造函数内定义的属性。

      ☞ 构造函数内定义的任何属性,包括函数在内都会被重复创建,同一个构造函数产生的两个对象不共享实例。

      ☞ 构造函数内定义的函数有运行时闭包的开销,因为构造函数内的局部变量对其中定义的函数来说也是可见的。

    下面这段代码可以验证以上问题:

    function Foo(){
        this.prop1 = 'lzl';
        this.func1 = function(){
            document.write(this.prop2);
        }
    }
    Foo.prototype.prop2 = 'lzljj';
    Foo.prototype.func2 = function(){
        document.write(this.prop2);
    }
    
    var foo1 = new Foo();
    var foo2 = new Foo();
    document.write(foo1.func1 == foo2.func1);// false
    document.write(foo1.func2 == foo2.func2);// true

    两者有各自的适用范围,那么我们什么时候使用原型,什么时候使用构造函数内定义来创建属性呢?

      ☞ 除非必须用构造函数闭包,否则尽量用原型定义成员函数,因为这样可以减少开销。

      ☞ 尽量在构造函数内定义一般成员,尤其是对象或数组,因为用原型定义的成员是多个实例共享的。

  • 相关阅读:
    广域网(ppp协议、HDLC协议)
    0120. Triangle (M)
    0589. N-ary Tree Preorder Traversal (E)
    0377. Combination Sum IV (M)
    1074. Number of Submatrices That Sum to Target (H)
    1209. Remove All Adjacent Duplicates in String II (M)
    0509. Fibonacci Number (E)
    0086. Partition List (M)
    0667. Beautiful Arrangement II (M)
    1302. Deepest Leaves Sum (M)
  • 原文地址:https://www.cnblogs.com/hwt987/p/3749423.html
Copyright © 2011-2022 走看看