Object javascript基础--对象封装( 二 )


原型链图示为:

Object  javascript基础--对象封装

文章插图
实例属性或方法的访问过程是一次搜索过程:
1.首先从对象实例本身开始,如果找到属性就直接返回该属性值;
2.如果实例本身不存在要查找属性,就继续搜索指针指向的原型对象,在其中查找给定名字的属性,如果有就返回;
基于以上分析,原型模式创建的对象实例,其属性是共享原型对象的;但也可以自己实例中再进行定义,在查找时,就不从原型对象获取,而是根据搜索原则,得到本实例的返回;简单来说,就是实例中属性会屏蔽原型对象中的属性;
接下来看一下这些属性和方法相等吗?
console.log(Tom.name === Linda.name);//trueconsole.log(Tom.sex === Linda.sex);//trueconsole.log(Tom.say === Linda.say);//true
提供一些验证实例和原型对象关系的方法
//isPrototypeOf用来判断,某个原型对象和某个实例之间的关系console.log(Person.prototype.isPrototypeOf(Tom)); //trueconsole.log(Person.prototype.isPrototypeOf(Linda)); //true//hasOwnProperty()方法,用来判断某一个属性到底是本地属性,还是继承自prototype对象的属性console.log(Tom.hasOwnProperty("name")); // falseconsole.log(Linda.hasOwnProperty("name")); // false//in运算符可以用来判断,某个实例是否含有某个属性,不管是不是本地属性console.log("name" in Tom); // trueconsole.log("name" in Linda); // true
5.封装模式四:组合构造函数及原型模式
简称组合模式,构造函数实例好比私有制,原型模式实例好比公有制,那么组合模式就是以公有制为核心,私有制并行的模式,佩服我历史学得真好!所以自己的属性就不要挂在原型对象上,只有共有属性和方法才挂在上面 。
function Person(name,sex){this.name = name;this.sex = sex;}Person.prototype = {//原型字面量方式会将对象的constructor变为Object,此外强制指回Personconstructor: Person,say: function(){console.log(this.name + ' is '+ this.sex);}}var Tom = new Person('Tom','male');var Linda = new Person('Linda','female');
原型链示图:
Object  javascript基础--对象封装

文章插图
做些测试吧!
console.log(Tom.name);//Tomconsole.log(Linda.name);//Lindaconsole.log(Tom.say === Linda.say);//true
6.封装模式五:动态原型模式
组合模式私有属性和共有属性及方法是分离的,如果能够放在一个构造函数里,那就真的和对象相差无几了 。
function Person(name,sex){this.name = name;this.sex = sex;if(typeof this.say != 'function'){Person.prototype = {constructor: Person,say: function(){console.log(this.name + ' is '+ this.sex);}}}}var Tom = new Person('Tom','male');var Linda = new Person('Linda','female');
来验证一下吧!
console.log(Tom.name);//Tomconsole.log(Linda.name);//Linda//===>想想为什么第一个Tom.say返回undefined?我似懂非懂Tom.say;//undefinedLinda.say;//function
7.封装模式六:寄生构造函数模式
还记得讲构造函数模式的时候,new的实质吗?温习一下:
new的实质是执行了以下操作
1.创建一个全新的对象
2.这个对象会被执行[[]]连接原型
3.函数调用中的this会绑定到新对象
4.如果函数没有返回其他对象,那么new 构造就会自动返回这个默认对象
注意:如果返回了其他对象,那么new关键词也就不会执行默认操作 。
现在有个疑问:以上以new创建实例的模式都没有返回新对象,而是依靠new的默认操作创建的对象实例 。但是,but,but,new默认返回的对象是类型,如果我现在要返回array或者其他对象,new就不能再执行其默认操作了,所以就要用语句重写构造函数,返回期望的对象类型 。