文章目录

创建对象

字面量

对象是键值对的集合,那么我们在声明一个对象的时候,可以通过字面量的形式来声明对象:

const valueObject = { name: 908 }
console.log('valueObject', valueObject)
console.log(typeof valueObject);// object
console.log(valueObject.constructor);// Object

valueObject的类型为:object
valueObject的构造函数为:Object

Object构造函数

通过new Object来声明一个对象:

const obj = new Object({ name: 234 });
console.log("obj", obj)
console.log(typeof obj);// object
console.log(obj.constructor);// Object
自定义构造函数

先自定义个构造函数:

let Person = function (living, name,) {
this.name = name;
this.living = living;
this.gender = gender;
}

通过new Person来声明对象:

const code = new Person(true, 'duXin', 1);
console.log(code)
console.log(typeof code); // object
console.log(code.constructor); // [Function: Person]

JavaScript内置的对象构造函数

除了我们自定义的构造函数以外,JavaScript有9个内置的对象构造函数:Number、String、Boolean、Object、Array、Function、Date、RegExp、Error

Math是一个静态对象,不是构造函数,Math作为JavaScript设置的对象命名空间,用来存储数学函数。

当试图访问一个对象的属性时,它会检查该属性的对象实例,如果实例拥有该对象属性,就返回该属性,如果没有,JavaScript会在对象的构造函数prototype对象上查找。

所有对象实例都有一个属性,连接到创建实例的构造函数【proto

使用hasOwnProperty验证对象属性是否来自原型链

通过​​in​​ 操作符可以验证一个对象的属性【包括来自原型链的属性】,hasOwnProperty方法可以检查来自非原型链属性的对象。

​for in​​​ 循环遍历对象属性,但是它不仅遍历本身属性,也遍历继承的对象上的属性,那么只能在循环内使用​​hasOwnProperty()​​方法来判断是属性是否是非原型链上的属性。

Object()

可以使用Object()构造函数来创建动态的普通对象。

Object()的属性:constructor
Object()的方法:hasOwnProperty()、isPrototypeOf()、propertyIsEnumerable()、 toLocaleString()、toString()、valueOf()

原型链以Object.prototype结尾,所以Object()的所有属性和方法被所有对象继承。

所有对象都继承自Object.prototype:

Object.prototype.foo = 'foo';

const str = 'bar'

console.log(str.foo); // foo
Function()

属性:prototype

实例的属性:arguments、constructor、length

实例的方法:apply()、call()、toString()

head/全局对象

JavaScript代码在浏览器中执行时,会被包含在window对象内,window对象就是全局对象。全局对象是JavaScript环境中可用的最高的作用域。

this

创建函数的时候,会自动创建一个this,它指向的是函数的调用者

prototype属性

原生的构造函数【Object()、Array()、Function()等】使用了prototype属性,方便构造函数的实例继承属性和方法。

原型

原型是一个对象,原型链把实例连接到构造函数的prototype属性上。当使用new关键字来创建一个实例的时候,都会在实例和构造函数的prototype属性之间添加一个隐藏连接【proto】,例如:

Array.prototype.foo = "bar";

const arr = new Array(1);

console.log(arr.__proto__.foo); //bar

因为prototype属性是一个对象,那么原型链或者查找中的最后一站是Object.prototype。例如:创建一个空数组,试图访问该数组上未定义的属性:

const array = [];

console.log(array.foo); // undefined

首先会查询原型链,如果没有找到foo属性,那么在Array.prototype中查找该属性,如果还是没有找到,则在Object.prototype上查找,最后在三个地方都没有找到的话,就返回undefined。

通过prototype属性,我们可以实现原型继承:

const Person = function () { }

Person.prototype.length = 3;
Person.prototype.arms = 3;
Person.prototype.do = function () {
return this.length + this.arms
}

const son = new Person();
console.log(son.do()); // 6