一、什么是原型模式
在js中,创建对象的方式有工厂模式和构造函数模式等,而构造函数模式最大的问题在于:构造函数中的每个方法都需要在实例对象中重新创建一遍,不能复用,所以为了解决这一个问题,就需要使用原型模式来创建对象。
引用>
<强>原型模式是把所有实例共享的方法和属性放在一个叫做原型(原型)的属性中>强,在创建一个函数时都会有个原型属性,这个属性是一个指针,指向一个对象,是通过调用构造函数而创建的那个对象实例的<强>原型对象强>。<代码>//构造函数 函数的人(){};//原型属性原型 Person.prototype.name='张三”; Person.prototype。sayName=function () { console.log (this.name); }; 让person1=新人(); person1.sayName ();//张三 让person2=新人(); person2.sayName ();//张三 console.log (person1。sayName==person2.sayName);//真正的代码><李>理解原型对象
无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个原型属性,这个属性<强>指向函数的原型对象>强,在默认的情况下,所有的原型对象都<强>自动获得一个构造函数(构造函数)属性,这是一个指针,指向原型属性所在的函数>强。创建了自定义的构造函数之后,其原型对象默认只会取得构造函数属性;其他的方法则是从对象继承来的。
李引用> > <李>
当调用构造函数创建一个<强>新实例对象强>后,该实例的<>强内部将包含一个指针(原型),指向构造函数的原型对象>强。这个连接存在于实例和构造函数的原型对象之间,而不是存在实例和构造函数之间。
每当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。搜索首先从对象实例本身开始。如果在实例中找到了就返回该属性的值,没有找的到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性,如果在原型对象中找到了这个属性,就返回该属性的值。
虽然<强>可以通过实例访问保存在原型中的值,但不能通过实例对象重写原型中的值>强,如果在实例中添加一个在原型中的同名属性,该属性会自动屏蔽原型中的属性,但是不会修改原型中的属性,只会阻止访问原型中的属性,通过删除操作符则可以完全删除实例属性,使得可以重新访问原型中的属性。原型与在操作符
hasOwnProperty()方法可以检测一个属性是否存在于实例对象中,
//构造函数
函数(){
这个人。16岁时=,
};
Person.prototype.name=罢湃?
让person1=新人();
console.log (person1.hasOwnProperty('名称'));//错误
console.log (person1.hasOwnProperty(年龄));//真正的在操作符的使用可以分为两类,单独使用和在工党循环使用,在单独使用时,在操作符会在通过对象能够访问给定属性时返回真,无论该属性存在于实例中还是原型中。
引用> 李> <李>
//构造函数
函数人(){}
Person.prototype.name=拧?
让person1=新人();
控制台。日志(“名字”person1);//
person1。年龄=14;
控制台。日志(person1“年龄”);//真正的
同时使用hasOwnProperty()方法和在操作符,可以确定该属性时在原型上还是在存在于对象中。
//构造函数
函数人(){}
函数hasPrototypeProperty(对象名称){
返回! object.hasOwnProperty(名字),,(名字对象),
}
Person.prototype.name=罢湃?
让人=new ();
控制台。日志(hasPrototypeProperty(人,'名称'));//
控制台。日志(hasPrototypeProperty(人,“年龄”));//假
使用工党循环时,返回的是所有能够通过对象访问的,可枚举的属性,其中即包含存在于实例中的属性,也包含与存在原型中的属性。
让o={
名称:“圣”,
年龄:14日
};
,(让关键o) {
console.log(关键);
}
要取得对象上所有可枚举的实例属性,可以使用种()方法,接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组。
如果想得到所有实例属性,无论是否可枚举,都可以使用Object.getOwnPropertyNames()方法。更简单的原型语法
为了减少不必要的输入和从视觉上更好的封装原型的功能,常见的做法是用一个包含所有属性和方法的对象字面量来重写整个原型对象。
//构造函数
函数人(){};
的人。原型={js中创建对象方式——原型模式