javascript创建对象(二)
原型模式:每创建一个函数都有一个prototype属性,它是一个指针,指向一个对象;
原型模式创建函数的方式:
function Movie(){
};
Movie.prototype.name="Interstellar";
Movie.prototype.year=2014;
Movie.prototype.country="American";
Movie.prototype.playMovie=function(){
alert(this.name);
}
var movie1=new Movie();
movie1.playMovie();//Interstellar;
var movie2=new Movie();
movie2.playMovie();//Interstellar;
alert(movie1.playMovie==movie2.playMovie);//true 有别于构造函数
对象字面量的方式
function Movie(){
};
Movie.prototype={
name:"Interstellar",
year:2014,
country:"American",
playMovie:function(){
alert(this.name);
}
}
//这种方式原型对象的contructor属性不会指向Movie了,而是指向Object了。
每当代码读取某个属性时,都会先搜索对象实例本身,没有就继续搜索指针指向的原型对象,如果有就结束;通过hasOwnProperty()可以检测属性是存在实例中还是原型中:
function Movie(){
};
Movie.prototype.name="FleetOfTime";
Movie.prototype.year=2014;
Movie.prototype.country="China";
Movie.prototype.playMovie=function(){
alert(this.name);
}
var movie1=new Movie();
alert(movie1.hasOwnProperty("name"));//原型上的 false
movie1.name="xxxx";
alert(movie1.hasOwnProperty("name"));//覆盖了原型上的,变成实例上的了 true
原型的动态性:对原型对象所做的任何修改都能够立即从实例中反映出来,例:
var movie=new Movie();
Movie.prototype.playOne=function(){
alert("One");
};
movie.playOne();//"One" //给Movie原型对象添加了一个方法
但是如果是重写整个原型对象的话,那么就等于切断了构造函数与最初原型之间的联系了:
function Movie(){
}
var movie=new Moive();
//重写原型对象
Movie.prototype={
constructor:Movie,//对象字面量方式强制指向Movie,本来指向Object
name:"xxx",
year:2012,
country:"xxxx",
sayName:function(){}
}
//这时候调用sayName()方法会出错
movie.sayName();//error
原型对象的问题:对于包含引用类型值的属性来说,就有很大问题了,如下例子
function Movie(){
}
Movie.prototype={
constructor:Movie,
name:"xxx",
year:2014,
place:["China","Japan"],
playName:function(){
alert(this.name);
}
}
var movie1=new Movie();
var movie2=new Movie();
movie1.place.push("korea");
alert(movie1.place)//"China,Japan,Korea"
alert(movie2.place)//"China,Japan,Korea"
//这里本来是想只改变movie1的place,结果也改到了movie2的
最好的创建对象方式:构造函数来定义实例属性,原型模式来定义方法和共享属性;
function Movie(name,year,country){
this.name=name;
this.year=year;
this.country=country
this.place=["China","Japan"];
}
Movie.prototype={
constructor:Movie,
playName:function(){
alert(this.name);
}
}
var movie1=new Movie("Interstellar",2014,"American");
var movie2=new Movie("FleetOfTime",2014,"China");
movie1.place.push("Korea");
alert(movie1.place);//"China,Japan,Korea"
alert(movie2.place);//"China,Japan"
alert(movie1.place==movie2.place);//false
alert(movie1.playName==movie2.playName);//true
javascript创建对象(二)的更多相关文章
- 2、JavaScript 基础二 (从零学习JavaScript)
11.强制转换 强制转换主要指使用Number.String和Boolean三个构造函数,手动将各种类型的值,转换成数字.字符串或者布尔值. 1>Number强制转换 参数为原始类型值的转换规 ...
- JavaScript创建对象(三)——原型模式
在JavaScript创建对象(二)——构造函数模式中提到,构造函数模式存在相同功能的函数定义多次的问题.本篇文章就来讨论一下该问题的解决方案——原型模式. 首先我们来看下什么是原型.我们在创建一个函 ...
- Javascript 创建对象的三种方法及比较【转载+整理】
https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...
- javascript创建对象的方法--基本模式
javascript创建对象的方法--基本模式 一.总结 关注本质 二.代码 <!DOCTYPE html> <html lang="zh-cn"> < ...
- javascript创建对象的方法--动态原型模式
javascript创建对象的方法--动态原型模式 一.总结 1.作用:解决组合模式的属性和函数分离问题 2.思路:基本思路和组合模式相同:共用的函数和属性用原型方式,非共用的的函数和属性用构造函数 ...
- javascript创建对象的方法--组合模式
javascript创建对象的方法--组合模式 一.总结 0.作用:解决原型模式对象独有属性创建麻烦的问题 1.组合模式使用普遍:jquery就是用的组合模式,组合模式使用非常普遍 2.组合模式优点: ...
- javascript创建对象的方法--原型模式
javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ...
- javascript创建对象的方法--构造函数模式
javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...
- javascript创建对象的方法--工厂模式(非常好理解)
javascript创建对象的方法--工厂模式(非常好理解) 一.简介 创建对象的方法 本质上都是把"属性"和"方法",封装成一个对象 创建对象的基本模式 普通 ...
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
随机推荐
- HttpServletRequest、request常用方法、request常见应用、请求转发、RequestDispatcher
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息. ...
- linux下jdk的卸载与安装
JDK的卸载 1.检查jdk的是否安装,显示如下表示安装: [root@localhost ~]# rpm -aq|grep java tzdata-java-2010l-1.el6.noarch j ...
- C语言宏定义函数中的“_##”的意思
最近在看google vp9的代码的时候碰到: #define intra_pred_sized(type, size) \ void vp9_##type##_predictor_##size##x ...
- hdoj 2074 叠筐
叠筐 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- 基于zabbix 内置key的应用
一.内置key说明: Zabbix 内置了很多丰富的key,使得咱们再添加linux os模板的时候,已经帮我们把key给定义好,这样我们就能够直接链接模板就可以使用了. 我们这边的话列举一些内置ke ...
- <%%>与<%=%>区别
1.<%= %>只能得到当前面定义的值.即你在这个页里有<% int a=100%>--你在下面才可以使用<%=a%>2.${ }这个是el表达式.可以从上下文中得 ...
- mdk编译遇见的错误(LX4F120H),望各位指点迷津
程序如下 #define tBoolean int#define GPIO_PORTA_BASE g_pulGPIOBaseAddrs[0]#include "lib/gpio.h" ...
- shell 获取当前ip
HOST_IP=$(hostname --all-ip-addresses | awk '{print $1}')
- UML要点总结(一)
UML中的事物 UML事物包含结构事物.行为事物.组织事物和辅助事物. 结构事物: 类.接口.用例.协作.活动类.组件和节点. 行为事物: 也称动作事物,交互和状态机. 组织事物: 也称分组事物,仅仅 ...
- 使用QEMU调试Linux内核代码
http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...