/**

 *在js中并不存在类,所以能够直接通过Object来创建对象,可是使用这样的方式创建有一

 *弊端:因为没有类的约束,无法实现对象的反复利用,而且没有一种规范约定,在操作时easy带来问题。

 */

var person = new Object();

person.name = "octopus";

person.age = 25;

person.say = function(){

  alert(this.name+","+this.age);

}

json:json就是js的对象,可是它省去了XML标签,而是通过{}来完毕对象的说明。

var person = {

  name:"张三",

  age:25,

  say:function(){

    alert(this.name+","+this.age);

  }

}

//通过json依旧能够创建对象数组,创建方式和js的数组一样。

var ps = [

  {name:"张三",age:25},

  {name:"李四",age:26}

];

for(var i=0;i<ps.length;i++){

  alert(ps[i].name);

}

/**

 * 创建一组用户,用户的属性有:

 * name:String,age:int,friends:Array

 * List<Person> ps = new ArrayList<Person>();

 * ps.add(new Person("张三",25,["Ada","Alice"]));

 * ps.add(new Person("李四",26,["Ada","Chris"]));

 * 把ps转换为json

 */

ps = [

  {

    name:"张三",

    age:25,

    friends:["Ada","Alice"]

  },

  {

    name:"李四",

    age:26,

    friends:["Ada","Chris"]

  }

];

//通过工厂的方式来创建对象

function createPerson(name,age){

  var o = new Object();

  o.name = this.name;

  o.age = this.age;

  o.say = function(){

    alert(this.name+":"+this.age);

  }

  return o;

}

//使用工厂的方式,尽管有效地攻克了类的问题,可是也存在还有一个问题:

//我们无法检測对象p1和p2的详细数据类型,用typeof p1/p2 得到的仅仅能是Object。

var p1 = createPerson("Ada",21); 

var p2 = createPerson("Leon",23);

p1.say();   //Ada:21

p2.say();   //Leon:23

/**

 * 通过构造函数的方式创建,和基于工厂的创建方式类似,

 * 最大的差别就是函数的名称就是类的名称,依照Java约定,第一个字母大写,

 * 使用构造函数创建时,在函数内部是通过thiskeyword来完毕属性的定义。

 */

function Person(name,age){

  this.name = name;

  this.age = age;

  //这样的方式带来的问题是全部的Person对象都会为该行为分配空间

  this.say = function(){

    alert(this.name+","+this.age);

  }

}

//通过Person来创建对象

var p = new Person("octopus",24);

p.say();  //octopus,24

/**

 * 使用构造函数的方式能够通过一下方式来检測对象的类型

 */

alert(p1 instanceof Person);  //true

alert(p1.say==p2.say);    //false

/**可是上述构造函数也会带来一些问题:

 * 1.每个对象中都会存在一个方法的拷贝,假设对象的行为非常对的话,空间的占有率就会大大添加

 * 解决方法:能够将函数放到全局变量中定义,这样能够让类中的行为指向同一个函数。

 */

function Person(name,age){

  this.name = name;

  this.age = age;

  //这样的方式带来的问题是全部的Person对象都会为该行为分配空间

  this.say = say;

}

//将行为设置为全局的

function(){

  alert(this.name+","+this.age);

}

alert(p1.say==p2.say);  //true

//可是假设将行为设置为全局函数的时候,这个函数就能够被window调用,此时就破坏了对象的封装性。

//并且假设非常多类用全局的方式定义了大量的方法,easy造成混乱,也将不利于开发。

下节我们学习用原型的方式创建对象。

原创文章如转载,请注明出处,本文首发于csdn站点:http://blog.csdn.net/magneto7/article/details/24906045

js:对象的创建(为prototype做铺垫)的更多相关文章

  1. js 对象的创建方式和对象的区别

    js一个有三种方法创建对象,这里做一个总结. 1.对象直接量 所谓对象直接量,可以看做是一副映射表,这个方法也是最直接的一个方法,个人比较建议, 1 2 3 4 5 6 7 8 9 10 11 12 ...

  2. js对象的创建与原型总结

    //1 新建对象 var box = new Object(); box.name = "lee"; box.age = 100; box.run = function(){ re ...

  3. js对象的创建

    一.通过对象直接量来创建 var emptyt={};  //相当于var empty=new Object; //如果属性名中包含空格.连字符(-).还有关键字,保留字时,要用字符串表示 var b ...

  4. js对象的创建模式

    方式一: Object构造函数模式 * 套路: 先创建空Object对象, 再动态添加属性/方法 * 适用场景: 起始时不确定对象内部数据 * 问题: 语句太多 /* 一个人: name:" ...

  5. JS对象的创建与使用

    本文内容:     1.介绍对象的两种类型:     2.创建对象并添加成员:     3.访问对象属性:     4.利用for循环枚举对象的属性类型:     5.利用关键字delete删除对象成 ...

  6. js对象的几种创建方式和js实现继承的方式[转]

    一.js对象的创建方式 1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性值. var person = new Object(); ...

  7. js对象小结

    前奏 对象是js的基本数据类型,准确来说除了字符串,数字,boolean值,null与undifine之外,js中的值都是对象.js中的对象是一种复合值,他将很多值(原始值或其他对象)聚合在一起,可以 ...

  8. javascript基础-js对象

    一.js对象的创建 1.普通最简单的方式 var teacher = new Object( ); teacher.name = "zhangsan"; teacher.age = ...

  9. JS对象与PHP对象的对比

    一.对象的创建与访问 1.JS对象的创建与访问 //方式一(通过内置构造函数创建后添加属性) var obj = new Object(); obj.name = 'Lucy'; //通过点添加属性 ...

随机推荐

  1. 洛谷P1803凌乱的yyy 题解

    题目传送门 这道题也是贪心思想.先排序一遍(按照结束的时间排)在进行扫描,满足条件的直接保存,增加ans,最后输出即可. #include<bits/stdc++.h> using nam ...

  2. DotNetOpenAuth实践之WCF资源服务器配置

    系列目录: DotNetOpenAuth实践系列(源码在这里) 上一篇我们写了一个OAuth2的认证服务器,我们也获取到access_token,那么这个token怎么使用呢,我们现在就来揭开 一般获 ...

  3. 【WPF】ListView自定义分页

    XAML: <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDe ...

  4. powershell 获取 CPU 物理 / 逻辑核心数

    转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/   获取 CPU 逻辑核心数的方法为:总逻辑核心数 = 物理核心数 * 每核逻辑核心数   其中 ...

  5. CTF西湖论剑

    一,西湖论剑 itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用 的基数.在上例中,转换基数为10.10:十进制:2:二进制... ...

  6. poj1860 & poj2240(Bellman-Ford)

    1860的思路是将可以换得的不同种的货币的数量当作节点,每个兑换点当成边,然后我抄了个算法导论里面的Bellman-Ford算法,一次就过了.看discussion里面很多讨论精度的,我想都没想过…… ...

  7. NetBIOS主机名扫描工具nbtscan

    NetBIOS主机名扫描工具nbtscan   NetBIOS主机名是NetBIOS协议为主机分配的名称.通过NetBIOS主机名,系统可以利用WINS服务.广播及Lmhost文件等多种模式将NetB ...

  8. javascript入门教程笔记

    BOM BOM 是“ Browser Object Model ”的缩写,简称“ 浏览器对象模型 ”. BOM 定义了 JavaScript 操作浏览器的接口,提供了访问某些功能(如浏览器窗口大小.版 ...

  9. Python中yield和yield from的用法

    yield python中yield的用法很像return,都是提供一个返回值,但是yield和return的最大区别在于,return一旦返回,则代码段执行结束,但是yield在返回值以后,会交出C ...

  10. 【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)

    4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 370  Solved: 237 De ...