首页 > web前端 > js教程 > 正文

浅谈JavaScript中的原型模式

高洛峰
发布: 2016-11-25 09:27:45
原创
1424人浏览过

    在javascript中创建对象由很多种方式,如工厂模式、构造函数模式、原型模式等:

立即学习Java免费学习笔记(深入)”;

<pre name="code" class="html">//工厂模式
function createPerson(name,age,job)
{
var o = new Object;
o.name = name;
o.age = age;
o.job = job;
o.sayName = function()
{
alert(this.name);
}
return o;
}
var person = createPerson('dw',20,'IT');

其等价的原型模式:

立即学习Java免费学习笔记(深入)”;

function Person()
{

}
Person.prototype =
{
name:"dw",
age:20,
job:"IT",
sayName:function()
{
alert(this.name);
}
};
var person2 = new Person;

    在Javascript中,每个函数都有prototype属性,该属性是一个指向原型对象的指针,可以用于创建所有实例共享的属性的和方法。在原型模式下,在创建一个实例person3

立即学习Java免费学习笔记(深入)”;

var person3 = new Person;
person2.name;  //dw
person3.name; //dw

person2和person3的name属性都返回dw。原型对象的属性和方法被所有特定类型的实例共享。在默认的情况下,每个原型对象会自动获得一个constructor属性,用于指向prototype属性所在函数的指针,如Person.prototype.constructor指向Person

立即学习Java免费学习笔记(深入)”;

alert(Person.prototype.constructor);   //返回Person的构造函数
//Person.prototype.constructor只是指向Person的一个指针,与Person并不相等
//以下均返回false
alert(Person.prototype.constructor === Person)
alert(Person.prototype.constructor == Person)

实例、原型对象、构造函数的三角恋关系如下图所示:

0827214828b3486d2d_13_0.png

在每一个实例的内部都有一个指针指向原型对象,在ECMA-262的第五版称之为[[prototype]]。在原型模式下创建的实例与构造函数没有直接的关系。

新鲜水果网站销售模板
新鲜水果网站销售模板

网站模板是能够具有交互性,能够包含更多活跃的元素,就有必要在网页中嵌入其它的技术。如:Javascript、VBScript、Document Object Model(DOM,文档对象模型)、Layers和 Cascading Style Sheets(CSS,层叠样式表),这里主要讲Javascript。那么Javascript是什么东西?Javascript就是适应动态网页制作的需要而诞生的

新鲜水果网站销售模板 70
查看详情 新鲜水果网站销售模板

     虽然无法访问[[prototype]],但可以用isPrototypeOf()方法来确定对象是否是原型对象。

立即学习Java免费学习笔记(深入)”;

alert(Person.prototype.isPrototypeOf(person2)); //true
alert(Person.prototype.isPrototypeOf(person3));//true

因为在实例内部均有一个指向Person.prototype的指针,所以均返回true。在ECMAScript 5中,可以用Object.getPrototypeOf()返回[[prototype]],即返回原型对象

立即学习Java免费学习笔记(深入)”;

alert(Object.getPrototypeOf(person2) == Person.prototype);  //true
alert(Object.getPrototypeOf(person2).name); //dw

    注意:虽然可以用实例访问原型中的值,但是不能通过实例重写原型中的值,即实例中添加了与原型中同名的属性,则原型的同名属性被屏蔽。

立即学习Java免费学习笔记(深入)”;

person2.name="qs";
alert(person2.name);//qs

即使将name属性设置为null,仍然不能访问原型中的name。可以用delete删除实例的name属性,则可以重新访问原型中的name.

立即学习Java免费学习笔记(深入)”;

<pre name="code" class="html">person2.name = null;
alert(person2.name);  //null
delete person2.name;alert(person2.name); //dw


    对于同名属性,可以用hasOwnProperty("propertyName")方法检测属性是属于实例还是原型,该方法只有在给定的属性存在实例中时才返回true

相关标签:
java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号