无域名建网站,wordpress主题开发电子书,最近三天的新闻大事国内,wordpress 相册 边框一、仔细分析前面的原型模式创建对象的方法,发现原型模式创建对象,也存在一些问题#xff0c;如下#xff1a; 1、它省略了为构造函数传递初始化参数这个环节,结果所有实例在默认的情况下都将取得相同的属性值#xff0c;这还不是最大的问题#xff01; 2、最大的问题是原型… 一、仔细分析前面的原型模式创建对象的方法,发现原型模式创建对象,也存在一些问题如下 1、它省略了为构造函数传递初始化参数这个环节,结果所有实例在默认的情况下都将取得相同的属性值这还不是最大的问题 2、最大的问题是原型中的所有属性是被很多实例所共享的,这种共享对于函数非常合适对于那些包含基本值的属性也说得过去,因为我们知道可以在实例上添加一个同名属性可以隐藏原型中的对应属性。但是对于包含应用类型值的属性来说,问题就非常严重了代码如下: function Person(){
}
Person.prototype{constructor:Person,name:张三,age:22,job:coder,friends:[李四,王五],sayName:function(){alert(this.name);}
}
var person1new Person();
var person2new Person();person1.friends.push(赵六);alert(person1.friends); //输出李四,王五,赵六alert(person2.friends);//输出李四,王五,赵六 分析上面的代码,当我们为person1添加一个朋友的时候,发现person2同时也被添加了一个朋友,但这并不是我们想要的而这正是因为原型模式的共享的本性所导致的,只要任何一个实例修改了原型属性对象中的属性值,所有与该原型对象关联的实例都会受到影响! 二、组合使用构造函数模式和原型模式 为了解决原型模式不能初始化参数和共享对于引用模式所存在的问题这里我们可以采用构造函数模式和原型模式的结合模式来创建自定义类型,构造函数用于与解决初始化参数(实例属性的定义),原型模式用于共享 方法和constructor。 这种构造函数与原型组合的模式创建自定义类型,是ECMAScript中使用最广泛、认同度最高的一种创建自定义类型的方法。可以说这是用来定义引用类型的一种默认模式。 代码如下: function Person(name,age,job){this.namename;this.ageage;this.jobjob;this.friends[小超,大超];}Person.prototype{constructor:Person,sayName:function(){alert(this.name);}}var person1new Person(张三,22,coder);var person2new Person(李四,22,coder);person1.friends.push(Stephen Curry,Kevin Durant);alert(person1.friends); //输出:小超,大超,Stephen Curry,Kevin Durantalert(person2.friends);//输出:小超,大超 通过上面的输出我们发现组合使用构造函数模式和原型模式创建的自定义类型及解决了 1、构造函数:构造函数创建类型相同的函数确是不同的作用域链和标识符解析(因为在JS中每创建一个函数就是一个对象,所以 (导致了构造函数中的方法) 在不同的实例中都需要重新创建一遍但是这些方法做的确实同一件事情) 2、原型模式:其不能初始化参数,以及它的共享性对与一些引用类型所造成的影响(比如数组) 转载于:https://www.cnblogs.com/GreenLeaves/p/5847653.html