标签:返回 情况 调用 改变 原型链 prot type属性 length child
(1)原型/原型对象
创建构造函数
function HI(name){
this.name=name;
this.sayHi=function(){
console.log(this.name)}
}
缺点:每创造一个对象都会新辟一个内存位置来存放功能函数,多个执行会减低性能
改进1
function HI(name){
this.name=name;
this.sayHi=sayHi;}
}
function sayHi(){
console.log(this.name);}
缺点:多个执行容易出现重名情况同时也不好查找
最终改进
采用原型
例0
Hi.prototype.sayHi=function(){
console.log(this.name);}
同时对象可以访问到原型的成员
在调用对象的属性和方法的时候,会先去找对象本身的属性和方法,没有才去找原型里的对象和方法,如果查找的东西在二者都没有时会报错
对象的__proto__(为非标准属性)等于构造函数中的.prototype
在原型对象中有一个constructor属性
该属性作用是记录了创建该对象的构造函数
只要是对象就会有__proto__属性,原型也拥有这个属性
而原型的__proto__指向object对象(object原型对象),object对象的prototype指向Object构造函数
再次指向object原型对象的__proto__属性,则指向null
从而形成一条原型链:在调用对象的属性和方法时,本身查找不到会按这条原型链查找下去,直到没有返回报错信息
例本身有一个Student构造函数
有一个调用该函数的s1对象
s1对象通过s1.__proto__指向Student构造函数的原型,Student构造函数的原型通过Student原型对象的__proto__指向Object原型对象,Object原型对象通过Object原型对象的__proto__指向null
在设置属性值时不会搜索原型链,所以一个对象的prototype值修改时不会使另一个对象受影响,因为不搜索原型链而采用新增属性值来完成
一般情况下,对象的属性值在构造函数中设置,对象的方法在构造函数中的原型设置,重新改变原型中的prototype属性,将原型设置为一个对象
例1
Student.prototype={
sayHi:function(){
console.log(‘hi‘);},(用逗号分隔开)
ok:function(){
console.log(‘ok‘);}
}
上面比较便捷,但是会导致s1.constructor属性不能正确显示出构造函数,因为会将prototype属性重新覆盖,显示的值为原型链下一个constructor的值
改进
Student.prototype={
constructor:Student,
sayHi:function(){
console.log(‘hi‘);},(用逗号分隔开)
ok:function(){
console.log(‘ok‘);}
另一个注意点,想使用原型对象,要先设置原型对象,否则无法访问原型
}
(2)
var arr=[4,5,6,8];
Array.prototype.getSum=function(){
//获取数组中的值采用this
for(i=0;i<this.length;i++){//}
}
注意数组或者String不能修改prototype的值,所以不能采用例1的写法,要用例0的写法
(3)防止他人不按规则调用函数
function Ok(option){
option=option||{};
this.name=option.name||‘xiaoming‘;
}
(4)对象拷贝
function extend(parents,child){
for(var key in parents){
if(child[key])
{
continue;}
child[key]=parents[key];
}
则子只需写不需要继承的数值。
(5)继承
指类型与类型之间的关系
目的是把子类型共同部分提升到父类型
1原型继承
child.prototype=new Parent();
child.prototype.constuctor=child;
缺点:无法设置构造函数的参数,不实用
标签:返回 情况 调用 改变 原型链 prot type属性 length child
原文地址:https://www.cnblogs.com/linquesblog/p/11327844.html