Javascript学习笔记——6.1 创建对象彩民之家高手论

2019-11-28 12:45 来源:未知

原型

每一个JavaScript对象(null除了这几个之外)都和另三个对象相关联,“另叁个”对象就是大家领会的原型,每三个对象都从原型世袭属性。

全数通过对象直接量成立的目的都抱有同多少个原型对象,并能够透过JavaScript代码Object.prototype获取对原型对象的援引。通过重要字new和构造函数调用成立的指标的原型就是布局函数的protopype属性的值。因而,同使用{}创造对象相像,通过new Object()创造的对象也世袭自Object.prototype。同样,通过new Array()创造的目标的原型正是Array.prototype,通过new Date()创制的靶子的原型正是Date.prototype。

原型

要清楚Object.create()方式,先要理解原型链的学识。

差那么一点每叁个javascript对象都有与之提到的对象,称为原型对象,四个指标从它的原型对象世袭属性。只顾原型对象不是类,而是三个真正的对象,那和遵照类的接轨要区分开。

援引对象原型:

  • 目的直接量和new Object()创制的对象世襲自Object.prototype。
  • 经过new 构造函数制造的目的的原型是结构函数的prototype属性,例如new Array()创造的靶子原型是Array.prototype。

独有少之又少的靶子未有原型,Object.prototype是里面之大器晚成,它不三番五次任何性质。

富有的停放布局函数都有延续自Object.prototype的原型,比如Date.prototype的习性持续自Object.prototye,所以new Date(卡塔尔国创立的对象世襲了Date.prototype和Object.prototype的属性。这种链型世袭关系称为原型链(prototype chain卡塔尔。

补充

  1. 未有原型的靶子十分少,Object.prototype便是内部之风姿洒脱,它不接二连三任何性质。
  2. 享有的嵌入结构函数(甚至大多数自定义的构造函数)都怀有三个继续自Object.prototype的原型。

Object.create()

Object.create(原型对象)创造叁个新的对象,它是二个静态函数,不是某些对象的调用方法。

var o1 = Object.create({x:1,y:2})
o1.x //1
o1.__proto__  //{x:1,y:2}
o1.x = 5
o1.__proto__ //{x:1,y:2}
o1.x //5

能够通过传播null作为参数创建二个不曾原型的新对象,这种对象未有继续任何性质和办法。

var o2 = Object.create(null)
o2.__proto__ //undefined

行使Object.create()创建四个空对象Object.create(Object.prototype),等同于{}new Object()

自由对象都得以当做原型对象创造新指标,即具有的靶子都足以被接续。

var o = {x:1,y:2}
var o1 = Object.create(o)
var o2 = Object.create(o)
o2.__proto__.x = 10
o1.__proto__.x //变成10了

通过new创设对象

new运算符创制并早先化多个新目的,举例:

 var o = new Object(); // 创建一个空对象,和{}一样
 var a = new Array(); // 创建一个空数组,和[]一样
 var d = new Date(); // 创建一个表示当前时间的Date对象
 var r = new RegExp("js"); // 创建一个可以进行模式匹配的RegExp对象
  • 指标直接量
  • 使用new关键字
  • Object.create()

引言

JavaScript中,能够由此对象直接量,关键字new(ECMAScript 5中的)Object.create(),函数来创设对象。

创建对象三种格局:

指标直接量

JavaScript中运用对象直接量来创造对象是最简便的方式。对象直接量是由若干名/值对组合的映射表,名/值对中级用冒号分隔,名/值对里面用逗号分隔,整个映射表用花括号括起来。

属性名能够是JavaScript标记符也得以是字符串直接量,属性值能够是自由等级次序的JavaScript表达式、表达式的值。

  1. 在ECMAScript 5(以至ECMAScript 3的有的贯彻)中,保留字能够用做不太带引号的属性名,不过对于ECMAScript 3以来,使用保留字作为属性名必需使用引号引起来。
  2. 在ECMAScript 5中,对象直接量中的最终一个属9性后的逗号将忽视,且在ECMAScript 3的超越四分之二贯彻也能够忽视这几个逗号,可是IE中则报错。

目的直接量是一个表明式,每趟运算都急需创设并最先化三个新对象。每一遍总结对象直接量的时候,都会精打细算该对象每一种属性的值。也等于说,借使在三个重新调用的函数中的循环体Nelly用了目的直接量,它将开创比相当多新对象,并每一趟创建的目的的质量也是有异常的大只怕天壤之别。

目的直接量

对象直接量是由若干名/值对构成的映射表,名和值用分号隔断,对中间用逗号隔开分离,整个映射表用花括号括起来,名值对堪称属性

var empty = {} //没有任何属性的对象
var point = {x:12,y:21}
var person = {
  name:'Mike',
  age:31
}

对象直接量是贰个表明式,表明式的运算会创设并最初化二个指标。

Object.create()

ECMAScript 5概念了一个名字为Object.create()方法,用于创建一个新对象,此中第三个参数是以此指标的原型,第四个参数可选,用于对指标的性质进一层描述。

Object.create()是二个静态函数,实际不是提必要有个别对象调用的秘籍。使用它的法门非常粗大略,只须传入所需的原型对象就可以:

 var o1 = Object.create({x:1,y:2}); // o1继承了属性x和y

能够通过传播参数null来创建一个平昔不原型的新指标,不过通过这种情势开创的对象不会持续任李强西,以至不包涵根底措施,例如toString(),也便是说,它将不能够和“ ”运算符一同符合规律职业:

 var o2 = Object.create(null); // o2不继承任何属性和方法

假若想创设七个常常的空对象(比方通过{}或new Object()创造的对象)。要求传入Object.prototype:

 var o3 = Object.create(Object.prototype); // o3和{}和new Object()一样

能够通过其余原型创设新对象(换句话说,能够使放肆对象可继续),那是贰个精锐的特色,在ECMAScript 3中得以如下代码来模拟原型继承:

// inherit()返回了一个继承自原型对象p的属性的新对象
// 这里使用ECMAScript 5中的Object.create()函数(如果存在的话)
// 如果不存在Object.create(),则退化使用其他方法
function inherit(p) {
    if (p == null) {
        throw TypeError(); // p是一个对象
    }
    if (Object.create) { // 如果Object.create()存在
        return Object.create(p); // 直接使用它
    }
    var t = typeof p; // 否则进行进一步检测
    if(t !== 'object' && t !== 'function') {
        throw TypeError();
    }
    function f() {}; // 定义一个空构造函数
    f.prototype = p; // 将其原型属性设置为p
    return new f(); // 使用f()创建p的继承对象
}

使用new

new运算符创造并开头化八个新目的。关键字new后跟随三个函数调用,称为布局函数(constructor卡塔尔国。

var o = new Object()//创建一个空对象{}
var a = new Array() //创建一个空数组 []
var d = new Date() //创建一个表示当前时间的Date对象
var r = new RegExp('js') //创建一个正则表达式对象

如上是放置的构造函数,顾客也足以自定义布局函数。

TAG标签:
版权声明:本文由彩民之家高手论坛发布于前端知识,转载请注明出处:Javascript学习笔记——6.1 创建对象彩民之家高手论