《JavaScript高级程序设计 (第3版)》学习笔记21:chapter_6 - 2 创建对象之动态原型、寄生构造函数和稳妥构造函数模式

这是第21篇笔记!
让学习“上瘾”,成为更好的自己!!!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
    // 一,动态原型模式
        
        function Person(name, age, job){

            this.name = name;
            this.age  =age;
            this.job = job;

            // 方法
            // 动态原型模式:把所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下),有保持了同时使用构造函数和原型的优点
            //              换句话讲,可以通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型
            // 只在sayName()方法不存在的情况下,才会将他添加到原型中,这段代码只会在初次调用构造函数时才会执行。此后,原型已经完成初始化,不在做任何事
            if(typeof this.sayName != 'function'){  // 这里对原型所作的修改,能够立即在所有的实例中得到反映
                Person.prototype.sayName = function(){
                    alert(this.name);
                }
            }
        }
        
        var friend = new Person('Kai', 29, 'teacher');
        friend.sayName();
    


	// 二,寄生构造函数模式
	
// 在前面几种模式都不适用的情况下,可以使用该种方式
    // 寄生构造函数模式:创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象

    // 除了使用new操作符合把包装函数叫做构造函数外,这个模式跟工厂模式一模一样
    function Person(name, age, job){
        var o = new Object();
        o.name = name;
        o.age = age;
        o.job = job;
        o.sayName = function(){
            alert(this.name);
        };
        return o;
        // 构造函数在不返回值的情况下,默认会返回新对象实例
        // 通过在构造函数的末尾添加一个return语句,可以“重写”调用构造函数时返回的值

    }
 
    // var friend = new Person('Kai', 29, 'teacher');
    // friend.sayName();  // "Kai"
    
    // 应用:这个模式可以在特殊的情况下用来为对象创建构造函数
    // 例如:创建一个具有额外方法的特殊数组,由于不能直接修改Array构造函数

    function SpecialArray(){

        // 创建数据
        var values = new Array();
        
        // 添加值
        values.push.apply(values, arguments);

        // 添加方法
        values.toPipeString = function(){
            return this.join('|');
        };

        // 返回数组
        return values;

    }

    var colors = new SpecialArray('red', 'blue', 'green');
    console.log(colors.toPipeString());
    
    // 【注意】 
    // 1, 该构造函数返回的对象与在构造函数外部创建的对象没有什么不同
    // 2, 不能依赖instanceof操作符来确定对象的类型(因为其类似于工厂模式)
    // 3, 建议在可以使用其他模式的情况下,不要使用该模式!!!
    



	// 三,稳妥构造函数模式
// 稳妥对象:没有公共属性,而且其方法也不引用this对象
    // 应用:适合在安全的环境中(这些环境会禁止使用this and new), 或者在防止数据被其他应用程序改动时使用

    // 稳妥构造函数模式与寄生构造函数模式的2点不同:
    // (1) 新创建的对象的实例方法不引用this
    // (2) 不使用new操作符调用构造函数



    function Person(name, age, job){
        // 创建要返回的对象
        var o = new Object();

        // 可以在这里定义私有变量和函数

        // 添加方法
        o.sayName = function(){
            alert(name);
        };


        // 返回对象 --> 稳妥对象
        return o;

    }
    
    var friend = Person('Kai', 29, 'teacher');
    friend.sayName();  // "Kai"
    // 变量friend中保存的是一个稳妥对象,而除了调用sayName()方法外,没有别的方式可以访问其数据成员
    // 即使有其他代码可以给这个对象添加方法或者数据成员,但也不可能有别的方法访问传入到构造函数中的原始数据


    
    // 【注意】 
    // 1, 该构造函数返回的对象与在构造函数外部创建的对象没有什么不同
    // 2, 不能依赖instanceof操作符来确定对象的类型(因为其类似于工厂模式)
    // 3, 建议在可以使用其他模式的情况下,不要使用该模式!!!
    


    
    </script>
</body>
</html>```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值