建设网站的工作流程价值30万的网站建设
web/
2025/10/4 2:50:31/
文章来源:
建设网站的工作流程,价值30万的网站建设,广告设计与制作流程,辽阳企业网站建设费prototype 属性的作用
JavaScript 规定#xff0c;每个函数都有一个prototype属性#xff0c;指向一个对象。
function f() {}
typeof f.prototype // object
上面代码中#xff0c;函数f默认具有prototype属性#xff0c;指向一个对象。
对于普通函数来…prototype 属性的作用
JavaScript 规定每个函数都有一个prototype属性指向一个对象。
function f() {}
typeof f.prototype // object
上面代码中函数f默认具有prototype属性指向一个对象。
对于普通函数来说该属性基本无用。但是对于构造函数来说生成实例的时候该属性会自动成为实例对象的原型。
构造函数的一个方法或者一个属性
function Animal(name) {this.name name;
}
Animal.prototype.color white;
var cat1 new Animal(大毛);
var cat2 new Animal(二毛);
cat1.color // white
cat2.color // white
上面代码中构造函数Animal的prototype属性就是实例对象cat1和cat2的原型对象。原型对象上添加一个color属性结果实例对象都共享了该属性。
Animal.prototype.color yellow;
cat1.color // yellow
cat2.color // yellow
如果实例对象自身就有某个属性或方法它就不会再去原型对象寻找这个属性或方法。
总结一下原型对象的作用就是定义所有实例对象共享的属性和方法。这也是它被称为原型对象的原因而实例对象可以视作从原型对象衍生出来的子对象。
原型链
总结一下原型对象的作用就是定义所有实例对象共享的属性和方法。这也是它被称为原型对象的原因而实例对象可以视作从原型对象衍生出来的子对象。
如果一层层地上溯所有对象的原型最终都可以上溯到Object.prototype即Object构造函数的prototype属性。也就是说所有对象都继承了Object.prototype的属性。这就是所有对象都有valueOf和toString方法的原因因为这是从Object.prototype继承的。
那么Object.prototype对象有没有它的原型呢回答是Object.prototype的原型是null。null没有任何属性和方法也没有自己的原型。因此原型链的尽头就是null。
读取对象的某个属性时JavaScript 引擎先寻找对象本身的属性如果找不到就到它的原型去找如果还是找不到就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到则返回undefined。如果对象自身和它的原型都定义了一个同名属性那么优先读取对象自身的属性这叫做“覆盖”overriding。
construction
prototype对象有一个constructor属性默认指向prototype对象所在的构造函数。
function P() {}
P.prototype.constructor P // true
由于constructor属性定义在prototype对象上面意味着可以被所有实例对象继承。
function P() {}
var p new P();
//应该有这个属性吗
p.constructor P // true
p.constructor P.prototype.constructor // true
p.hasOwnProperty(constructor) // false p小自身没有constructor属性
上面代码中p是构造函数P的实例对象但是p自身没有constructor属性该属性其实是读取原型链上面的P.prototype.constructor属性。
constructor属性的作用是可以得知某个实例对象到底是哪一个构造函数产生的。
另一方面有了constructor属性就可以从一个实例对象新建另一个实例。
function Constr() {}
var x new Constr();
var y new x.constructor();
y instanceof Constr // true
上面代码中x是构造函数Constr的实例可以从x.constructor间接调用构造函数。这使得在实例方法中调用自身的构造函数成为可能。
instanceof运算符
instanceof运算符返回一个布尔值表示对象是否为某个构造函数的实例。
var v new Vehicle();
v instanceof Vehicle // true
上面代码中对象v是构造函数Vehicle的实例所以返回true。
instanceof运算符的左边是实例对象右边是构造函数。它会检查右边构造函数的原型对象prototype是否在左边对象的原型链上。因此下面两种写法是等价的。
v instanceof Vehicle
// 等同于
Vehicle.prototype.isPrototypeOf(v)
上面代码中Vehicle是对象v的构造函数它的原型对象是Vehicle.prototypeisPrototypeOf()方法是 JavaScript 提供的原生方法用于检查某个对象是否为另一个对象的原型详细解释见后文。
由于instanceof检查整个原型链因此同一个实例对象可能会对多个构造函数都返回true。
var d new Date();
d instanceof Date // true
d instanceof Object // true
上面代码中d同时是Date和Object的实例因此对这两个构造函数都返回true。
由于任意对象除了null都是Object的实例所以instanceof运算符可以判断一个值是否为非null的对象。
var obj { foo: 123 };
obj instanceof Object // true
null instanceof Object // false
上面代码中除了null其他对象的instanceOf Object的运算结果都是true。
instanceof的原理是检查右边构造函数的prototype属性是否在左边对象的原型链上。有一种特殊情况就是左边对象的原型链上只有null对象。这时instanceof判断会失真。
var obj Object.create(null);
typeof obj // object
obj instanceof Object // false
上面代码中Object.create(null)返回一个新对象obj它的原型是nullObject.create()的详细介绍见后文。右边的构造函数Object的prototype属性不在左边的原型链上因此instanceof就认为obj不是Object的实例。这是唯一的instanceof运算符判断会失真的情况一个对象的原型是null。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86556.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!