一.在了解原型以前须要提早了解的。
1.工厂模式:建立一个函数,用特定的接口建立对象的细节。函数
//如今要建立两个包含 “name”和“age”的对象, let tom ={name:"Tom",age:16} let lily = { name : "Lily",age:18} ……//所示数量足够具大 ,对象足够大 ,会花费大量的时间。下面的工厂模式能 很好的解决这一问题
//工厂的就是只流水线不是全部都是要人工,节约人力成本。 function person(name,age){ let obj = {}; //建立一个对象 ; obj.name = name ; //为对象添加细节 obj.age = age ; obg.sayHello= function (){ alert ("Hello"+this.name) }; return obj;} //返回这个对象 let tom = person("Tom",16); let lily = person("Lily",18)
2.构造函数:自定义构造函数,能够自定义对象类型的属性和方法。this
function Person(name,age){ this.name = name ; //为对象添加细节 this.age = age ; this.sayHello= function (){ alert ("Hello"+this.name) }; let tom = new Person("Tom",16); let lily =new Person("Lily",18)
①
建立了一个对象;②
将this
指向这个对象;③
返回这个对象;constructor
(构造函数),指向Person
;这就是能够经过constructor
判断对象类型的原理。二.原型模式
1.以下,与构造函数模式不一样的是,原型模式的每一个实例都是访问同一属性同一函数,,函数不用从新建立。spa
function Person () { this.x = 100; } Person.prototype.name = 'Tom'; Person.prototype.age = 18; Person.prototype.sayHello = function (){ alert(`Hello${this.name}`) } let Tom = new Person() Tom.sayHello()
2.原型对象prototype
prototype
,是一个对象,这个函数指向函数的原型对象;prototype
这个对象上,自带一个属性,constructor
指向当前这个类;③当为实例添加属性时,这个属性会屏蔽原型对象中保存的同名属性,可是事实阻止访问,并无修改那个属性,若将同名的实例属性设置为null
,一样会屏蔽,可是若用delete
,则能够删除实例属性,能够从新访问原型中的属性。3d
alert(Tom.age); //18 let Tom.age = 20; alert(Tom.age); //20 delete Tom.age; alert(Tom.age); //18
this
都是实例。为何私有属性(来自实例的属性)的查找等级要高呢?这就涉及到原型链。3.原型链:每一个对象数据类型(普通对象,prototype
,实例)都有一个属性,叫作__proto__
;code
console.log(Tom.age)
的查找过程是怎样的呢?①首先在私有空间内查找age属性,私有空间的属性包括自身的属性和从类那里继承的属性,__proto__
去当前实例所属类的原型上进行查找,找到的话,说明是共有属性;__proto__
去当前实例所属类的原型进行查找,找不到将继续经过__proto__
一直找到Object
。 ①
表明Person
的原型对象;曲线②
中,实例Tom
经过__proto__
指向Tom
所属类(Person
)的原型(Person Prototype
);曲线③中,Person的原型对象经过__proto__
找到Person
对象的所属类,也就是Object
(函数也是对象类,万物皆对象),指向它的原型(ObjectPrototype
) ;曲线5
中,指向Obeject
所属类的原型,它的类就是它本身,因此此时不在有__proto__
整个属性查找结束,这就是原型链的查找过程。⑤经过hasOwnProperty
来判断属性,这个方法就是经过④中的查找过程,在基类Object
中找到的。 判断属性是否在对象上“name” in Tom
,其中in
的查找过程也是经过上述的查找过程。对象
function hasPrototypeProperty(object,attr){ return !object.hasOwnProperty(attr) && (attr in object);}
4.关于原型须要注意的几点blog
①使用简单原型语法的时候,注意constructor
的指向问题,继承
Person.prototype={ //此时constructor指向Object构造函数 name : 'Tom', age:18 } Person.prototype={ //此时constructor指向Person constructor:Person, name : 'Tom', age:18 }