javascript-面向对象和原型(3).

进阶的面向对象和原型--常见技巧

原型模式创建对象也有自己的缺点,它省略了构造函数传参初始化这一过程,带来的缺点就是初始化的值都是一致的.而原型最大的缺点就是它最大的优点,那就是共享.
原型中所有属性是被很多实例共享的,共享对于函数非常适合,对于包含基本值得属性也还可以 .但如果属性包含引用类型,就存在一定的问题

 1  function Box(){};
 2
 3  Box.prototype ={
 4      constructor:Box,
 5      name:‘Lee‘,
 6      age:100,
 7      family:[‘哥哥‘,‘姐姐‘,‘妹妹‘],
 8      run:function()
 9      {
10          return this.name + this.age+‘运行中...‘;
11      }
12  };
13
14  var box1 = new Box();
15  alert(box1.family);                       //‘哥哥‘,‘姐姐‘,‘妹妹‘
16  box1.family.push(‘弟弟‘);               //在第一个实例修改后引用类型,保持了共享
17
18  alert(box1.family);                    //‘哥哥‘,‘姐姐‘,‘妹妹‘,‘弟弟‘
19
20  //再次实例化 Box 我希望得到的是 [‘哥哥‘,‘姐姐‘,‘妹妹‘] 但是因为 共享 所以得到了[‘哥哥‘,‘姐姐‘,‘妹妹‘,‘弟弟‘]
21  var box2 = new Box();                    //共享了box1添加后的引用类型的原型
22  alert(box2.family);                    //‘哥哥‘,‘姐姐‘,‘妹妹‘,‘弟弟‘

★为了解决这个问题,可以采用 组合构造函数+原型模式

 1 function Box()
 2  {
 3      this.name =name ;
 4      this.age =age;
 5      this.family =[‘哥哥‘,‘姐姐‘,‘妹妹‘];
 6  }
 7
 8 Box.prototype ={
 9     constructor:Box,
10     run:function(){
11         return this.name + this.age+‘运行中...‘;
12     }
13
14 }
15
16 var box1 =new Box(‘Lee‘,100);
17 alert(box1.family);                                //‘哥哥‘,‘姐姐‘,‘妹妹‘
18 box1.family.push(‘弟弟‘);
19 alert(box1.family);                                //‘哥哥‘,‘姐姐‘,‘妹妹‘,‘弟弟‘
20
21 var box2 =new Box(‘jack‘,200);
22 alert(box2.family);                                //‘哥哥‘,‘姐姐‘,‘妹妹‘
23 //引用类型没有使用原型,所有没有共享

★原型模式,不管你是否调用了原型中的共享方法,它都会初始化原型中的方法,并且在声明一个对象时,
构造函数+原型部分让人感觉怪异,最好就是把构造函数和原型封装到一起。为了解决这个问题,我们可以使用动态原型模式

 1 //可以将原型封装到构造函数里
 2 function Box()
 3  {
 4      this.name =name ;
 5      this.age =age;
 6      this.family =[‘哥哥‘,‘姐姐‘,‘妹妹‘];
 7
 8      //原型的初始化,只要第一次初始化,就可以了,没必要每次构造函数实例化的时候都初始化
 9      if(typeof this.run != ‘function‘)                        //判断方法是否存在
10      {
11          Box.prototype.run =function()
12          {
13             return this.name + this.age+‘运行中...‘;
14          }
15      }
16
17  }
18
19     var box1 =new Box(‘Lee‘,100);
20     alert(box1.run());
21
22     var box2 =new Box(‘jack‘,200);
23     alert(box2.run());

扩展:寄生构造函数=工厂模式+构造函数

 1 function Box(name , age)
 2     {
 3         var obj =new Object();
 4         obj.name =name;
 5         obj.age=age;
 6         obj.run=function()
 7         {
 8             return this.name + this.age+‘运行中...‘;
 9         }
10         return obj;
11     }
12
13     var box1 = new Box(‘Lee‘,100);
14     alert(box1.run());
15
16     var box2 = new Box(‘jack‘,200);
17     alert(box2.run());

扩展:稳妥构造函数[没看出稳妥构造函数和工厂方式的区别 除了函数名首字母大写]

 1 function Box(name , age)
 2     {
 3         var obj =new Object();
 4         obj.name =name;
 5         obj.age=age;
 6         obj.run=function()
 7         {
 8             return this.name + this.age+‘运行中...‘;
 9         }
10         return obj;
11     }
12
13     var box1 =Box(‘Lee‘,100);
14     alert(box1.run());
15
16     var box2 =Box(‘jack‘,200);
17     alert(box2.run());
时间: 2024-10-20 13:17:39

javascript-面向对象和原型(3).的相关文章

第一百零九节,JavaScript面向对象与原型

JavaScript面向对象与原型 学习要点: 1.学习条件 2.创建对象 3.原型 4.继承 ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,ECMAScript没有类的概念,因此它的对象也与基于类的语言中的对象有所不同.   一.学习条件 在JavaScript视频课程第一节课,就已经声明过,JavaScript课程需要大量的基础.这里,我们再详细探讨一下: 1

JavaScript 面向对象 (prototype 原型模式)

一. JavaScript 设计思想 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时.但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力.比如,如果网页上有一栏"用户名"要求填写,浏览器就无法判断访问者是否真的填写了,只有让服务器端判断.如果没有填写,服务器端就返回错误,要求用户重新填写,这太浪费时间和服务器资源了. 因此,网景公司急需一种网页脚本语言,使得浏览器可以与网页互动.工程师_Brend

JavaScript面向对象与原型(一):构造函数

提到构造函数,我们并不陌生,在面向对象领域,构造函数已经是一个老生常谈的问题了.在JavaScript中再次学习,真的是有一种亲切的感觉. 一.简单回顾 构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载. C#构造函数(一个简单的小例子): <span style="font-size:14px;"

有关javaScript面向对象和原型笔记

javaScript是一种比較特殊的语言,ECMAScript中没有类的概念.跟其它面向对象的语言有一定的差别.它的对象也与基于类的语言中的对象有所不同,严格来说,javascript对象是一组没有特定顺序的值,对象的每一个属性或方法都有一个名字.而每一个名字都映射到一个值.每一个对象都是基于一个引用类型的创建的. 创建自己定义对象的最简单的方式就是创建一个Object的实例.然后再为其加入属性和方法,如: var box = new Object(); //创建对象 box.name1 = '

javascript面向对象和原型

/* //工厂模式 function createObject(name,age){ var obj = new Object();//新建一个对象 obj.name=name;//新建对象的属性 obj.age=age; obj.run=function(){//新建对象的方法 return this.name+","+this.age+"...running."; } return obj;//返回新建的对象引用 } var box1 = createObjec

JavaScript面向对象与原型

工厂模式:无法识别对象 function createObject(name, age) { //集中实例化的函数 var obj = new Object(); obj.name = name; obj.age = age; obj.run = function () { return this.name + this.age + '运行中...'; }; return obj;}var box1 = createObject('Lee', 100); //第一个实例var box2 = cr

JavaScript 面向对象与原型

ECMAScript有两种开发模式:1.函数式(过程化);2.面向对象(OOP); 一 创建对象1.普通的创建对象 ? 1 2 3 4 5 6 7 8 9 // 创建一个对象,然后给这个对象新的属性和方法;   var box = new Object();       // 创建一个Object对象;   box.name = 'lee';          // 创建一个name属性并赋值;   box.age = 100;   box.run = function(){        //

JavaScript面向对象和原型函数

对象,是javascript中非常重要的一个梗,是否能透彻的理解它直接关系到你对整个javascript体系的基础理解,说白了,javascript就是一群对象在搅..(哔!). 常用的几种对象创建模式 使用new关键字创建 最基础的对象创建方式,无非就是和其他多数语言一样说的一样:没对象,你new一个呀! var gf = new Object(); gf.name = "tangwei"; gf.bar = "c++"; gf.sayWhat = functio

快速理解JavaScript面向对象编程—原型继承

总的来说js语言就是门面向对象编程的语言,对象这个概念几乎贯穿了整个js的学习. 对象 创建对象两种方法:(若要生成对象实例必须调用构造函数) 1.var obj = {name:"jer" , age:12};(在js内部调用了预设的Object()构造函数) 访问:alert(obj.name);//"jer" alert(obj["name"]);//"jer" 2.var obj = new Object(); obj

javascript面向对象和原型————呱呱二号

面向对象 1.工厂模式 function createObject(name,age){ let obj = new Object(); this.name = name; this.age = age; return obj; } let objA = createObject('Tom',24); let objB = createObject('Jane',23); typeof ObjA; //Object typeof ObjB; //Object ObjA instanceof Ob