初探Js中的prototype
2015-08-19 19:24
681 查看
原型的设置
对象的原型属性是用来继承属性的。所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过通过JavaScript代码Object.prototype获得对原型对象的引用。一个简单的例子:
var person = function(name,age){ this.name=name; this.age=age; } person.prototype.sex="man"; person.prototype.hello=function(){ alert("hello") } /*等同于*/ person.prototype={ sex="man", hello=function(){alert("hello")} } var Alice =new person('Alice','22'); console.log(Alice.name);//Alice console.log(Alice.age);//22 console.log(Alice.sex);//man console.log(Alice.hello);//hello
从上面可以看出,prototype是一个对象。在person()构造函数里,只定义了name和age属性。随后,通过对person对象原型的修改,来实现其他属性的继承。这种继承是一种动态继承,一旦父函数对象声明了相关的prototype属性,由其创建的对象会自动继承这些prototype的属性。但是继承的属性并没有被分配内存,其实它只是对原型的一种引用。
原型的查询和检测
在ECMAscript3中,一般使用表达式o.constructior.prototype来检测一个对象的原型。通过new表达式创建的对象,通常继承一个constructor属性,这个属性指代创建这个对象的构造函数。constructor的值是一个函数对象。var F = function(){}//这是一个函数对象 var p = F.prototype//这是与f相关联的原型对象 var c = p.constructor//这是与原型相关联的函数 c === F// =>true:对于任意函数F.prototype.constructor=F
可以看到构造函数的原型中存在预先定义好的constructor属性,这意味着对象通常继承的constructor均指代它们的构造函数。
在ECMAscript5中,将对象作为参数传入Object.getprototypeof()可以查询它的原型。
function Rectangle() { } var rec = new Rectangle(); Object.getPrototypeOf(rec) === Rectangle.prototype// true 此外,要想检测一个对象是否是另一个对象的原型(或处于原型链中),可以用isPrototypeOf方法。 var p={name:Lisa};//定义一个原型对象 var o=Object.create(p);用p为原型创建一个对象 p.isPrototypeOf(o)//=>true Object.prototype.isPrototypeOf(o)//=>true:p继承自Object.prototype
此外,还有一个__proto__属性基本被现代的浏览器支持(IE11)。可以利用它直接查询和设置对象的原型。
var obj = { __proto__: someOtherObj, method: function() { ... } }
在ECMAscript6中,添加了一种新的设置原型方法。Object.setPrototypeOf(object,prototype)
// 格式 Object.setPrototypeOf(object, prototype) // 用法 var o = Object.setPrototypeOf({}, null);
文章参考:
《JavaScript权威指南》David
Flanagan
《ECMAscript
6 入门》阮一峰点击打开链接
相关文章推荐
- Canvas——JavaScript高级程序设计笔记(12)
- ExtJS学习之MessageBox
- javascript对闭包的深入理解
- javascript对闭包的深入理解
- Javascript闭包
- js将html table导成excel表格,IE、Google Chrome都能用
- js封装库2-连缀
- javascript -- 阻止默认事件 阻止事件冒泡
- BrowseForFolder使用,参数详解
- 如何将js导入时的小红叉去掉
- js中return的各种作用
- JS字符串转换成日期格式
- js左右轮播代码
- js实现左右轮播效果
- javascript--执行字符串代码和变量的几种方法
- JavaScript——关于列表权重的笔试题
- js异步请求的几种方法
- libCEF中C++与JavaScript的交互调用【编程语言】
- javascript中0和空字符串在==和===的情况下的比较
- Javascript Garden