原型模式:每创建一个函数都有一个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创建对象(二)的更多相关文章

  1. 2、JavaScript 基础二 (从零学习JavaScript)

     11.强制转换 强制转换主要指使用Number.String和Boolean三个构造函数,手动将各种类型的值,转换成数字.字符串或者布尔值. 1>Number强制转换 参数为原始类型值的转换规 ...

  2. JavaScript创建对象(三)——原型模式

    在JavaScript创建对象(二)——构造函数模式中提到,构造函数模式存在相同功能的函数定义多次的问题.本篇文章就来讨论一下该问题的解决方案——原型模式. 首先我们来看下什么是原型.我们在创建一个函 ...

  3. Javascript 创建对象的三种方法及比较【转载+整理】

    https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...

  4. javascript创建对象的方法--基本模式

    javascript创建对象的方法--基本模式 一.总结 关注本质 二.代码 <!DOCTYPE html> <html lang="zh-cn"> < ...

  5. javascript创建对象的方法--动态原型模式

    javascript创建对象的方法--动态原型模式 一.总结 1.作用:解决组合模式的属性和函数分离问题  2.思路:基本思路和组合模式相同:共用的函数和属性用原型方式,非共用的的函数和属性用构造函数 ...

  6. javascript创建对象的方法--组合模式

    javascript创建对象的方法--组合模式 一.总结 0.作用:解决原型模式对象独有属性创建麻烦的问题 1.组合模式使用普遍:jquery就是用的组合模式,组合模式使用非常普遍 2.组合模式优点: ...

  7. javascript创建对象的方法--原型模式

    javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ...

  8. javascript创建对象的方法--构造函数模式

    javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...

  9. javascript创建对象的方法--工厂模式(非常好理解)

    javascript创建对象的方法--工厂模式(非常好理解) 一.简介 创建对象的方法 本质上都是把"属性"和"方法",封装成一个对象 创建对象的基本模式 普通 ...

  10. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

随机推荐

  1. HttpServletRequest、request常用方法、request常见应用、请求转发、RequestDispatcher

        HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息. ...

  2. linux下jdk的卸载与安装

    JDK的卸载 1.检查jdk的是否安装,显示如下表示安装: [root@localhost ~]# rpm -aq|grep java tzdata-java-2010l-1.el6.noarch j ...

  3. C语言宏定义函数中的“_##”的意思

    最近在看google vp9的代码的时候碰到: #define intra_pred_sized(type, size) \ void vp9_##type##_predictor_##size##x ...

  4. hdoj 2074 叠筐

    叠筐 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  5. 基于zabbix 内置key的应用

    一.内置key说明: Zabbix 内置了很多丰富的key,使得咱们再添加linux os模板的时候,已经帮我们把key给定义好,这样我们就能够直接链接模板就可以使用了. 我们这边的话列举一些内置ke ...

  6. <%%>与<%=%>区别

    1.<%= %>只能得到当前面定义的值.即你在这个页里有<% int a=100%>--你在下面才可以使用<%=a%>2.${ }这个是el表达式.可以从上下文中得 ...

  7. mdk编译遇见的错误(LX4F120H),望各位指点迷津

    程序如下 #define tBoolean int#define GPIO_PORTA_BASE g_pulGPIOBaseAddrs[0]#include "lib/gpio.h" ...

  8. shell 获取当前ip

    HOST_IP=$(hostname --all-ip-addresses | awk '{print $1}')

  9. UML要点总结(一)

    UML中的事物 UML事物包含结构事物.行为事物.组织事物和辅助事物. 结构事物: 类.接口.用例.协作.活动类.组件和节点. 行为事物: 也称动作事物,交互和状态机. 组织事物: 也称分组事物,仅仅 ...

  10. 使用QEMU调试Linux内核代码

    http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...