javascript创建对象(一)
对象定义:无序属性的集合,属性包含基本值、对象、函数,相当于一组没有特定顺序的值。
创建自定义对象最简单的方式就是:
var movie=new Object();
movie.name="Interstellar";
movie.year=2014;
movie.country="American";
movie.playMovie=function(){
alert(this.name);
};
当然还可以写成对象自变量的方式:
var movie={
name:"Interstellar",
year:2014,
country:"American",
playMovie:function(){
alert(this.name);
}
};
上面两种都有明显的缺点:如果使用同一个接口创建很多对象,那么会产生大量的重复代码
所以出现了工程模式,还是以前面的例子来修改:
function showMovie(name,year,country){
var p=new Object();
p.name=name;
p.year=year;
p.country=country;
p.playMovie=function(){
alert(this.name);
};
return p;
}
用的时候直接赋给一个变量:
var movie1=showMovie("Interstellar",2014,"American");
var movie2=showMovie("FleetofTime",2014,"China");
工厂模式虽然解决了创建多个相似对象的问题,但是没有解决对象识别的问题(怎样知道一个对象的类型),
于是构造函数出现,接着前面例子修改:
function Movie(name,year,country){
this.name=name;
this.year=year;
this.country=country;
this.playMovie=function(){
alert(this.name);
};
}
//注意:
//这里没有return,没有显示的创建对象,把方法和属性都赋给了this对象;
//构造函数始终应该以一个大写字母开头,而非构造函数则以小写开头;
这里有几种调用构造函数的方式:
第一种通过new操作符:
var movie1=new Movie("Interstellar",2014,"American");
var movie2=new Movie("FleetofTime",2014,"China");
movie1、movie2都有一个constructor属性,指向Movie
alert(movie1.constructor==Movie);//true
alert(movie2.constructor==Movie);//true;
当然检测对象类型instanceof操作符要更可靠一些
alert(movie1 instanceof Movie);//true
alert(movie2 instanceof Movie);//true
alert(movie1 instanceof Object);//true
alert(movie2 instanceof Object);//true
注意的是所有对象都继承自Object;
第二种调用是把它作为普通的函数来调用,那么属性和方法都被添加到window对象了撒:
Movie("Interstellar",2014,"American");
window.playName();// "Interstellar"
第三种就是通过call()(apply())来到另一个对象的作用域中调用:
var p=new Object();
Movie.call(p,"FleetOfTime",2014,"China");
p.playMovie();//FleetOfTime
以上就是调用构造函数的三种方式了,那么构造函数有什么问题呢,可以试着执行下面代码发现不同实例上的同名函数不相等
alert(movie1.playMovie==movie2.playMovie)//false //构造函数主要的问题就是每个方法都要在每个实例上重新创建一遍
我们可以通过把函数定义转移到构造函数外面来解决这个问题,如下:
function Movie(name,year,country){
this.name=name;
this.year=year;
this.country=country;
this.playMovie=playMovie;
}
funciton playMovie(){
alert(this.name);
}
//这里构造函数里面的playMovie包含一个指向函数的指针
但是如果对象需要定义很多方法,那么就需要定义很多个全局函数了。所以出现了原型模式,当然原型模式也会存在问题,目前一般是运用构造函数+原型的组合方法来创建对象。见下节。。
最后:1937年12月13日,侵华日军野蛮侵入南京,制造了惨绝人寰的南京大屠杀惨案,30万同胞惨遭杀戮,无数妇女遭到蹂躏残害,无数儿童死于非命,三分之一建筑遭到毁坏,大量财物遭到掠夺。侵华日军一手制造的这一灭绝人性的大屠杀惨案,是第二次世界大战史上“三大惨案”之一,是骇人听闻的反人类罪行,是人类历史上十分黑暗的一页,勿忘国耻。
javascript创建对象(一)的更多相关文章
- Javascript 创建对象方法的总结
最近看了一下<Javascript高级程序设计(第三版)>,这本书很多人都推荐,我也再次郑重推荐一下.看过之后总得总结一下吧,于是我选了这么一个主题分享给大家. 使用Javascript创 ...
- javascript创建对象的几种方式
javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON:但写法有很多种,也能混合使用.主要为下面几种:1.对象字面量的方式 person={firstname ...
- javascript创建对象的方法总结
Javascript创建对象 最简单的方法:创建object实例. var person=new Object(); person.name="Joey";person.age=2 ...
- javascript创建对象的相关问题
javascript创建对象的方法有很多种,一般来说,推荐使用对象字面量来创建对象. 对象构造函数捕捉 使用new Object来创建对象,可能会带来一些问题: var o = new Object( ...
- JavaScript创建对象(三)——原型模式
在JavaScript创建对象(二)——构造函数模式中提到,构造函数模式存在相同功能的函数定义多次的问题.本篇文章就来讨论一下该问题的解决方案——原型模式. 首先我们来看下什么是原型.我们在创建一个函 ...
- Javascript 创建对象的三种方法及比较【转载+整理】
https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...
- JavaScript创建对象的6种方式
JavaScript创建对象简单的说,无非就是使用内置对象(Object)或各种自定义对象,当然还可以用JSON,但写法有很多种,也能混合使用. 1.对象字面量的方式 person = {name : ...
- JavaScript 创建对象的七种方式
转自:xxxgitone.github.io/2017/06/10/JavaScript创建对象的七种方式/ JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以 ...
- Javascript创建对象几种方法解析
Javascript创建对象几种方法解析 Javascript面向对象编程一直是面试中的重点,将自己的理解整理如下,主要参考<Javascript高级程序设计 第三版>,欢迎批评指正. 通 ...
- JavaScript创建对象的几种 方式
//JavaScript创建对象的七种方式 //https://xxxgitone.github.io/2017/06/10/JavaScript%E5%88%9B%E5%BB%BA%E5%AF%B9 ...
随机推荐
- HDU-1874 畅通工程续 (最短路径启蒙题)
hdu 1874比较基础,拿来练各种刚学会的算法比较好,可以避免好多陷阱,典型的最短路模板题 畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memor ...
- Suse系统用户不能登录报错
Linux系统用户创建了user用户,使用putty登陆系统,用户为user,系统登陆报 错: Could not chdir to home directory /home/user: Permis ...
- java 枚举(括号赋值)
详解在这里 要注意的是: 1. 通过括号赋值,而且必须带有一个参构造器和一个属性跟方法,否则编译出错2. 赋值必须都赋值或都不赋值,不能一部分赋值一部分不赋值:如果不赋值则不能写构造器,赋值编译也出错 ...
- 特性扩展:WebActivatorEx
WebActivator: PreApplicationStartMethod 属性,用于标记作为东西您获取 Web 应用程序启动时调用的方法,在Application_Start前. PostApp ...
- poj 2932 Coneology(扫描线+set)
Coneology Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3574 Accepted: 680 Descript ...
- linux IPC总结——管道
管道 管道是unix ipc的最古老形式,是一种在内存中的特殊文件,只能在具有公共祖先的进程之间使用(即父子进程,兄弟进程). 管道由pipe函数创建 #include <unistd.h> ...
- Javascript and AJAX with Yii(在yii 中使用 javascript 和ajax)
英文原文:http://www.yiiframework.com/wiki/394/javascript-and-ajax-with-yii /*** http://www.yiiframework. ...
- hdoj 1201 18岁生日
18岁生日 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- ORA-01502: 索引或这类索引的分区处于不可用状态
ORA-01502: 索引或这类索引的分区处于不可用状态 原因: 出现这个问题,可能有人move过表,或者disable 过索引.1. alter table xxxxxx move tablespa ...
- action使用大全
1.Intent的用法: (1)Action跳转 1. 使用Action跳转,当程序AndroidManifest.xml中某一个 Activity的IntentFilter定义了包含Action, ...