js17---创建对象:构造函数式和原型组合模式、动态原型模式、稳妥构造函数式

简介:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Untitled Document</title>
        <script type=text/javascript charset=utf-8 >
        //自定义原型对象会改变原型对象的构造器。
        //原型的概念: 原型对象里的所有属性和方法 被所有构造函数实例化出来的对象所共享
        function Person(){}
        Person.prototype = {
            constructor:Person , 
            name: 'z3' , 
            age:  20 , 
            job : '程序员' ,
            friends : ['李四','王五'] ,
            sayName : function(){alert('我的名字!')}
        };    
        var p1 = new Person();
        var p2 = new Person();    
        p1.friends.push('赵六');//数组的.push方法
        alert(p1.friends);//改了
        alert(p2.friends);



        
        //我们一般组合使用构造函数式和原型模式,在实际开发中,这种模式也是应用的最为广泛。
        // 组合使用原型和构造函数式 (定义一个类 开发时常用的方式),不能只用构造函数式或只用原型式。
        function Person(name , age , friends , job){
            this.name = name ; 
            this.age  = age ; 
            this.friends = friends ;
            this.job = job ;
        }
        Person.prototype = {
            constructor: Person , 
            sayName : function(){
                alert(this.name);//谁调用sayName,this就是谁
            }
        };
        var p1 = new Person('z3' , 20 , ['王五','赵六'] , '技术总监');
        var p2 = new Person('李四', 25 , ['王五','赵六' ,'赵7'] ,'boss');
        alert(p1.friends);
        p1.sayName();
        alert(p2.friends);
        p2.sayName();
        
        
        
        
        
        //动态原型模式:(让你的代码 都封装到一起)。动态原型模式:就是把信息都封装到函数中,这样体现了封装的概念。
        function Person(name , age , friends , job){
            this.name = name ; 
            this.age  = age ; 
            this.friends = friends ;
            this.job = job ;
            //动态原型方法:
            if( typeof this.sayName != 'function'){//第一次new一个Person的时候会在原型添加这个方法,第二次new Person对象的时候就不会创建了。typeof是小写的function,constructor是大写的Function
                Person.prototype.sayName = function(){
                    alert(this.name);
                }
            }
        }    
        /*        
        var o = {
            name:2,
            age:"22"
        }
        alert(o.sayName);//undefined
        alert(typeof o.sayName);//undefined
        */        
        
        
        
        //稳妥构造函数式: durable object(稳妥对象) 非常安全的环境中
        // 1 没有公共属性 , 2 不能使用this对象
        function Person(name , age , job){
                // 创建一个要返回的对象,工厂模式,
                var obj = new Object();
                //可以定义一下私有的变量和函数 private,js里面是var局部变量,外部访问不了,内部函数使用,类似于java里面通过private声明一些变量方法。
                var name = name ; 
                //var sex = '男';
                //var saySex = function(){};
                //添加一个方法
                obj.sayName = function(){
                    alert(name);
                }
                return obj ;                
        }
        var p1 = new Person('张三');
        p1.sayName();
        </script>
    </head>
    <body>
    </body>
</html>
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/6868739.html,如需转载请自行联系原作者

相关文章
|
JavaScript 前端开发 Java
深入JS面向对象(原型-继承)(一)
深入JS面向对象(原型-继承)
31 0
|
1月前
|
JavaScript
js开发:请解释什么是ES6的类(class),并说明它与传统构造函数的区别。
ES6的类提供了一种更简洁的面向对象编程方式,对比传统的构造函数,具有更好的可读性和可维护性。类使用`class`定义,`constructor`定义构造方法,`extends`实现继承,并可直接定义静态方法。示例展示了如何创建`Person`类、`Student`子类以及它们的方法调用。
22 2
|
1月前
|
JavaScript 前端开发
js开发:请解释原型继承和类继承的区别。
JavaScript中的原型继承和类继承用于共享对象属性和方法。原型继承利用原型链查找属性,节省内存但不支持私有成员。类继承通过ES6的class和extends实现,支持私有成员但占用更多内存。两者各有优势,适用于不同场景。
19 0
|
2月前
|
JavaScript 前端开发
JavaScript中的正则表达式构造函数和正则表达式字面量
JavaScript中的正则表达式构造函数和正则表达式字面量
|
3月前
|
存储 JavaScript 前端开发
构造函数和原型的结合应用:轻松搞定JS的面向对象编程(三)
构造函数和原型的结合应用:轻松搞定JS的面向对象编程
|
3月前
|
设计模式 JavaScript 前端开发
构造函数和原型的结合应用:轻松搞定JS的面向对象编程(一)
构造函数和原型的结合应用:轻松搞定JS的面向对象编程
|
3月前
|
存储 JavaScript 前端开发
构造函数和原型的结合应用:轻松搞定JS的面向对象编程(二)
构造函数和原型的结合应用:轻松搞定JS的面向对象编程
|
1月前
|
JavaScript
JS数组增删方法的原理,使用原型定义
JS数组增删方法的原理,使用原型定义
|
1月前
|
JavaScript
|
1月前
|
JavaScript
JS原型对象prototype
JS原型对象prototype