zoukankan      html  css  js  c++  java
  • 比较js中创建对象的几种方式

    1.工厂模式

    function createObj(name, sex){
            var obj = new Object();
            obj.name = name;
            obj.sex = sex;
            obj.sayName = function(){
                alert(this.name);
            }
            return obj;
        }
    
        var person = createObj('Tom', 'man');

    缺点:①无法确定对象的类型(因为都是Object)。

       ②创建的多个对象之间没有关联。

    2.构造函数

    function createObj(name, sex){
            this.name = name;
            this.sex = sex;
            this.sayName = function(){
                alert(this.name);
            }
        }
    
        var person = new createObj('Tom', 'man');

    缺点:①多个实例重复创建方法,无法共享。

         ②多个实例都有sayName方法,但均不是同一个Function的实例。

    3.原型方法

    function createObj(){}
    
        createObj.prototype.name = 'Tom';
        createObj.prototype.sex = 'man';
        createObj.prototype.sayName = function(){
            alert(this.name);
        }
    
        var person = new createObj();

    缺点:①无法传入参数,不能初始化属性值。

         ②如果包含引用类型的值时,改变其中一个实例的值,则会在所有实例中体现。

    4.组合式(构造函数+原型方法)推荐使用

    function createObj(name, sex){
            this.name = name;
            this.sex = sex;
        }
        createObj.prototype.sayName = function(){
            alert(this.name);
        }
    
        var person = new createObj('Tom', 'man');

    优点:构造函数共享实例属性,原型共享方法和想要共享的属性。可传递参数,初始化属性值。

    5.动态原型方法

    function createObj(name, sex){
            this.name = name;
            this.sex = sex;
            if(typeof this.sayName != 'function'){
                createObj.prototype.sayName = function(){
                    alert(this.name);
                }
            }
        }
    
        var person = new createObj('Tom', 'man');

    说明:if语句中只会调用一次,就是在碰到第一个实例调用方法时会执。此后所有实例都会共享该方法。在动态原型方法下,不能使用对象字面量重写原型。

  • 相关阅读:
    LeetCode 769. Max Chunks To Make Sorted
    LeetCode 845. Longest Mountain in Array
    LeetCode 1059. All Paths from Source Lead to Destination
    1129. Shortest Path with Alternating Colors
    LeetCode 785. Is Graph Bipartite?
    LeetCode 802. Find Eventual Safe States
    LeetCode 1043. Partition Array for Maximum Sum
    LeetCode 841. Keys and Rooms
    LeetCode 1061. Lexicographically Smallest Equivalent String
    LeetCode 1102. Path With Maximum Minimum Value
  • 原文地址:https://www.cnblogs.com/hcy1996/p/5916421.html
Copyright © 2011-2022 走看看