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

js一个有三种方法创建对象,这里做一个总结.

1.对象直接量

所谓对象直接量,可以看做是一副映射表,这个方法也是最直接的一个方法,个人比较建议,


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//创建简单对象

var obj1 = {}; //空对象

var obj2 = {

  name: "ys",

  age: 12

};

//创建复杂对象

var obj3 = {

  name: "ys",

  age: 12,

  like: {

    drink: "water",

    eat: "food"

  }

};

console.log(typeof obj1);  //object

console.log(typeof obj2);  //object

console.log(typeof obj3);  //object

有的人可能会发现,这里的键值名怎么没有引号”“,好细心,其实这个引号(单引双引号,js一样)加不加都行,但是个人建议加上,为什么能,因为加上之后,键值名可以很随意….当然如果你不乱定义名字的话,第一个比较好,因人而异,

?


1

2

3

4

5

6

7

8

9

10

var obj4 = {

  "my name": "ys"//键值名中间有空格

  "my-age": 12,    //键值名中间有连字符

  "while": 111    //键值名是关键字

}

console.log(obj4[‘my name‘]);  //ys

console.log(obj4[‘my-age‘]);  //12

console.log(obj4.while);    //111

console.log(typeof obj3);    //object

通过上面的例子,大家可以看出”.”和”[]”访问属性的区别了吧

对象直接量创建的对象,键值对的值支持表达式,如下

?


1

2

3

4

5

6

7

8

9

10

var obj3 = {

  name: "ys",

  age: obj2.age,   //引用obj2.age

  like: {

    drink: "water",

    eat: "food"

  }

};

console.log(obj3.age); //100

2.new创建对象

1).系统内置对象

?


1

2

3

4

5

6

7

8

9

var obj1 = new Object();

var obj2 = new Array();

var obj3 = new Date();

var obj4 = new RegExp("ys");

console.log(typeof obj1);  //object

console.log(typeof obj2);  //object

console.log(typeof obj3);  //object

console.log(typeof obj4);  //object

2).自定义对象

?


1

2

3

4

5

6

7

8

9

10

11

function Person(name, age){

  this.name = name;

  this.age = age;

}

var obj1 = new Person("ys", 12);

console.log(Object.prototype.toString.call(obj1));  //object

console.log(Person instanceof Object);        //true

console.log(typeof obj1);              //object

console.log(obj1.age);                //12

3.Object.create()创建

该方法有两个参数,我就只解释下第一参数,第二个参数不常用(对对象的属性进行进一步描述) 
第一个参数:传入要继承的原型(prototype)对象 
怎样理解这句话呢?

?


1

2

3

4

5

6

var obj1 = Object.create({

  name: "ys",

  age: 12

});

console.log(obj1);     //{}

console.log(obj1.age);   //12

obj1为{},为什么可以访问到属性值呢?我们理解下第一个参数的意义“传入要继承的原型对象”

console.log(obj1.__proto__);  //Object {name: "ys", age: 12}

对象本身为空,但是原型链上数据不为空,存在obj1.age,所以可以访问到。

1).当第一个参数为null时

?


1

2

var obj2 = Object.create(null);   //不继承对象应有的属性和方法

console.log(obj2 + "abc");     //报错 ,失去 + 功能

为什么会报错呢?正常参数下生成的图如下:

通过图可以看出,要继承的原型对象(即参数)又继承了Object的原型对象,关键原因来了,Object的原型对象包含了一些js对象的基本方法(indexOf(),toString(),‘+‘功能……)而这个时候,如果参数为null,那么这条继承链就断了。

这个时候大家应该理解了一句话了吧,JavaScript中所有的对象都继承自Object,以为Object处于继承链的最顶端。

2).创建空对象

?


1

2

3

var obj3 = Object.create(Object.prototype);

console.log(obj3);              //{},(空对象,与前两个方法 {},new Object 相同)

console.log(obj3.__proto__);         //如下图 ,只包含了基本对象的方法

代码的图:

这样创建的对象,只包含了对象的基本方法。

3).最后大家看下面的代码,希望能更深刻的理解Object.create()方法,大家可以参考这篇文章:《一种新的javascript对象创建方式Object.create()》

?


1

2

3

4

5

6

7

8

9

var obj1 = {

  name: "ys",

  age: 12

};

obj1.prototype = {

  sayName: function(){

    return console.log(this.name);

  }

};

?


1

2

3

4

5

6

/*①对象参数,只继承对象*/

var obj2 = Object.create(obj1);

console.log(obj2);                 //{}

console.log(obj2.name);               //ys

/*console.log(obj2.sayName());*/          /* 报错 obj2.sayName is not a function*/

console.log(obj2.__proto__.prototype.sayName());  //ys 理解原型的原型

如果不理解的话,看下面的图

?


1

2

3

4

5

6

7

/*②对象原型,继承对象原型*/

var obj3 = Object.create(obj1.prototype);

console.log(obj3);                 //{}

console.log(obj3.name);               //undefined,没有继承对象本身

obj3.name = "ys";

console.log(obj3.name);               //ys

console.log(obj3.sayName());            //ys

代码不理解看图(设置name后的图):

这个时候相信大家都理解第一个参数了吧。

以上就是本文的全部内容,希望可以帮助大家更好的创建对象。

时间: 2024-08-13 14:51:41

js 对象的创建方式和对象的区别的相关文章

js对象的创建方式

js对象的创建方式: js也具有OOP编程思想,了解js对象,可以进一步了解js是如何面向对象编程的. js的创建对象方式: 1.   Object var a=new Object();a.name="jack";a.age=20;a.sayName=function () { console.log(this.name);} a.sayName();//打印jack 2.  字面量 var b={name:"rose",age:20,sayName:functi

cocos2d-x 3.0 常用对象的创建方式

cocos2d-x 3.0 中所有对象几乎都可以用create函数来创建,其他的创建方式也是有create函数衍生. 下面来介绍下create函数创建一般对象的方法,省得开发中经常忘记啥的. 1.精灵Sprite的4种创建方式 (1)根据图片资源路径来创建 ? 1 2 3 4 //根据图片路径来创建 auto sprite1 = Sprite::create(filepath); //根据图片路径来创建,并设置要显示的图片大小 auto sprite2 = Sprite::create(file

Delphi中对象的创建,理解对象名与对象实体的本质区别

2015.08.06我总结的关于New和指针的问题(见此博客),最近在使用Delphi的面向对象的时候,发现很多类似的问题,现在也要总结一下. 目前以下的总结是针对Delphi的,对于C++我还没有实验过. 情况一:对一个对象变量多次Create 首先说一下对象声明的时候 var ObjectA: ClassA; 比如有一个类ClassA,用它来声明一个变量 ObjectA: ClassA; 注意这个时候的ObjectA相当于一个空指针,因为此时并没有创建一个对象实体(参看博客:http://w

字符串类的定义和字符串类对象的创建方式

String为字符串类. 其定义如下: public final class String 可以看出,String类是final类型的,是不可继承的.从源代码还可以看出,String从本质上说就是一个char类型的数组. 字符串类对象的声明有两种方式. 第一种,使用new关键字创建. String 变量名=new String("值"); 第二种,直接声明并初始化. String 变量名="值"; 我更喜欢第一种,标准的,所有类的对象的声明都通过  new 类的构造

由php的单例模式到php对象的创建方式

最近去面试,遇到一个单例模式的问题,学到一些以前没想到的东西,虽然面试失败,不过还是不错的哦.给大家分享下.php是以进程的方式运行的,我们忽略多线程的问题,不用给属性加锁.常用的单例模式类.单例模式运行的场景,有时我们可能在一个进程里面某一个类只有一个实例运行.常用的单例模式是这么写的.class SingleClass{ private static $instance = null; //构造方法 private function __construct(){ echo " new obj

SpringIOC_对象的创建方式

Spring创建对象的几种方式 默认的构造 静态工厂 实例工厂 一 :默认构造方法创建对象     1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLS

C#之序列化对象(二进制方式序列化对象)

应用程序有时需要以对象的形式在磁盘上存储数据,FrameWork有两个可用的实现方式: 一:System.Runtime.Serialization.Formatters.Binarry这个名称空间包含了BinarryFormatter类,它能把对象序列化为二进制数据,把二进制数据序列化为对象 二:System.Runtime.Serialization.Formatters.Soap:这个名称空间中包含了类SoapFormat类,它能把对象序列化为Soap格式的XML数据 以上两个类都实现了I

JS 面向对象之对象的创建

在学习了面向对象,我们了解了面向对象的三大特性:封装.继承.多态.下面我们需要了解对象的创建方式: 1 字面量创建方式 对象有很多描述方式,比如键值对(key--value)的集合.字典.工具包.对象的本质是对变量和函数进行封装,将变量封装成属性,函数封装为方法:这里我们就是采用字典的方式来创建对象,将属性和方法名作为key 1.1 创建一个书对象 var book = { name:"js入门教学", price:"¥34", author:"刘忻欢&q

奇葩的对象创建方式(更新中)

1.日志对象的创建方式 public static final Logger  log =Logger.getLogger(需要产生日志文件的class对象); 2.httpClient对象的创建方式 CloseableHttpClient httpclient = HttpClients.createDefault(); 3.获取一个Http返回的对象 CloseableHttpResponse response = httpClient.execute(get);