黄山市网站建设,网络设计报告模板,做一个app上架需要多少费用,设计网站建设图片上文,通过基本的对象创建问题了解了构造函数#xff0c;本文#xff0c;我们接着上文继续了解构造函数的基本特性#xff0c;以及优缺点. 每个对象上面都有一个constructor属性( 严格意义上来说#xff0c;是原型上的#xff0c;对象是通过查找到原型找到 constructor属性… 上文,通过基本的对象创建问题了解了构造函数本文我们接着上文继续了解构造函数的基本特性以及优缺点. 每个对象上面都有一个constructor属性( 严格意义上来说是原型上的对象是通过查找到原型找到 constructor属性 ).后面讲到原型的时候我会用示意图的方式说明 1 function CreateObj(uName) {2 this.userName uName;3 this.showUserName function () {4 return this.userName;5 }6 }7 var obj1 new CreateObj(ghostwu);8 var obj2 new CreateObj(卫庄);9 console.log( obj1.constructor CreateObj ); //true
10 console.log( obj2.constructor CreateObj ); //true 默认情况下对象的constructor等于实例化对象的构造函数, constructor最初的作用是用来标识对象的但是并不是特别准确因为constructor能被修改, 识别对象一般用instanceof关键字. 什么是instanceof 要理解这个关键字需要搞清楚原型链这里我提前把他放出来 //假设instanceof运算符左边是L右边是R
L instanceof R
//instanceof运算时通过判断L的原型链上是否存在R.prototype
L.__proto__.__proto__ ..... R.prototype
//如果存在返回true 否则返回false 注意instanceof运算时会递归查找L的原型链即L.__proto__.__proto__.__proto__.__proto__...直到找到了或者找到顶层为止。 所以一句话理解instanceof的运算规则为 instanceof检测左侧的__proto__原型链上是否存在右侧的prototype原型。 console.log( obj1 instanceof Object ); //trueconsole.log( obj2 instanceof Object ); //trueconsole.log( obj1 instanceof CreateObj ); //trueconsole.log( obj2 instanceof CreateObj ); //true obj1,obj2之所以是Object的实例因为所有对象继承自Object 借用构造函数 一个空对象可以借用现有的构造函数完成属性和方法的复制 1 function CreateObj(uName) {2 this.userName uName;3 this.showUserName function () {4 return this.userName;5 }6 }7 var obj new Object();8 CreateObj.call( obj, ghostwu );9 console.log( obj.userName ); //ghostwu
10 console.log( obj.showUserName() ); //ghostwu 构造函数的优点与缺点 优点就是能够通过instanceof识别对象缺点是每次实例化一个对象都会把属性和方法复制一遍 1 var obj1 new CreateObj(ghostwu);
2 var obj2 new CreateObj(卫庄);
3
4 console.log( obj1.showUserName obj2.showUserName ); //false 从以上执行结果可以看出obj1.showUserName和obj.showUserName不是同一个【在js中引用类型比较的是地址, 函数是一种引用类型】而是存在两个不同的内存地址因为每个对象的属性是不一样的这个没有什么问题但是方法执行的都是一样的代码所以没有必要复制存在多份浪费内存.这就是缺点 怎么解决构造函数的方法复制多次的问题 1 function CreateObj(uName) {2 this.userName uName;3 this.showUserName showUserName;4 }5 function showUserName (){6 return this.userName;7 }8 var obj1 new CreateObj(ghostwu);9 var obj2 new CreateObj(卫庄);
10 console.log( obj1.showUserName obj2.showUserName ); //true 把对象的方法指向同一个全局函数showUserName, 虽然解决了多次复制问题但是全局函数非常容易被覆盖也就是大家经常说的污染全局变量. 比较好的解决方案 通过原型(prototype)对象把方法写在构造函数的原型对象上 1 function CreateObj(uName) {
2 this.userName uName;
3 }
4 CreateObj.prototype.showUserName function(){
5 return this.userName;
6 }
7 var obj1 new CreateObj(ghostwu);
8 var obj2 new CreateObj(卫庄);
9 console.log( obj1.showUserName obj2.showUserName ); //true 什么是原型对象以及原型链且听下回分解 转载于:https://www.cnblogs.com/ghostwu/p/7434609.html