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,如需转载请自行联系原作者

相关文章
|
1月前
|
JavaScript 前端开发
js开发:请解释原型继承和类继承的区别。
JavaScript中的原型继承和类继承用于共享对象属性和方法。原型继承通过原型链实现共享,节省内存,但不支持私有属性。
23 0
|
1月前
|
JavaScript 前端开发 Java
深入JS面向对象(原型-继承)(三)
深入JS面向对象(原型-继承)
34 0
|
1月前
|
JavaScript 前端开发 Java
深入JS面向对象(原型-继承)(一)
深入JS面向对象(原型-继承)
37 0
|
1月前
|
JavaScript
js开发:请解释什么是ES6的类(class),并说明它与传统构造函数的区别。
ES6的类提供了一种更简洁的面向对象编程方式,对比传统的构造函数,具有更好的可读性和可维护性。类使用`class`定义,`constructor`定义构造方法,`extends`实现继承,并可直接定义静态方法。示例展示了如何创建`Person`类、`Student`子类以及它们的方法调用。
26 2
|
5天前
|
设计模式 JavaScript 前端开发
在JavaScript中,继承是一个重要的概念,它允许我们基于现有的类(或构造函数)创建新的类
【6月更文挑战第15天】JavaScript继承促进代码复用与扩展,创建类层次结构,但过深的继承链导致复杂性增加,紧密耦合增加维护成本,单继承限制灵活性,方法覆盖可能隐藏父类功能,且可能影响性能。设计时需谨慎权衡并考虑使用组合等替代方案。
26 7
|
1天前
|
设计模式 JavaScript 前端开发
【JavaScript】深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略
JavaScript的继承机制基于原型链,它定义了对象属性和方法的查找规则。每个对象都有一个原型,通过原型链,对象能访问到构造函数原型上的方法。例如`Animal.prototype`上的`speak`方法可被`Animal`实例访问。原型链的尽头是`Object.prototype`,其`[[Prototype]]`为`null`。继承方式包括原型链继承(通过`Object.create`)、构造函数继承(使用`call`或`apply`)和组合继承(结合两者)。ES6的`class`语法是语法糖,但底层仍基于原型。继承选择应根据需求,理解原型链原理对JavaScript面向对象编程至关重要
18 7
【JavaScript】深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略
|
8天前
|
JavaScript 前端开发
深入解析JavaScript中的面向对象编程,包括对象的基本概念、创建对象的方法、继承机制以及面向对象编程的优势
【6月更文挑战第12天】本文探讨JavaScript中的面向对象编程,解释了对象的基本概念,如属性和方法,以及基于原型的结构。介绍了创建对象的四种方法:字面量、构造函数、Object.create()和ES6的class关键字。还阐述了继承机制,包括原型链和ES6的class继承,并强调了面向对象编程的代码复用和模块化优势。
20 0
|
30天前
|
JavaScript 前端开发
前端 JS 经典:原型和原型链
前端 JS 经典:原型和原型链
23 0
|
1月前
|
前端开发 JavaScript
前端 js 经典:原型对象和原型链
前端 js 经典:原型对象和原型链
28 1
|
1月前
|
JavaScript
js中如何使用工厂方式和构造函数创建对象,web开发项目实例
js中如何使用工厂方式和构造函数创建对象,web开发项目实例