创建方式
// 字面量创建
var obj = {};
// 内置构造函数创建
var obj = new Object();
// 使用工厂函数创建对象
function createObj(name, age, gender) {
let obj ={};
obj.name = name;
obj.age = age;
obj.gender = gender;
return obj;
}
let obj1 = createObj();
// 自定义构造函数创建
// 1、自己书写一个构造函数
// 2、使用构造函数创建对象
function createObj(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
let obj1 = new createObj('jack', 18, '男');
原型/原型对象(prototype)
// 定义:每一个函数天生自带一个属性叫做 prototype,它是一个对象
// 属性: constructor 表示该原型对象是哪一个构造函数伴生的
// 作用:就是为了书写一些方法给该构造函数的实例对象使用
// 向 prototype 上添加一些属性和方法
function person() {
Person.prototype.sayHi = function() {
console.log('hello world');
}
}
proto
// 定义:每一个对象天生自带一个属性,叫做 __proto__,指向所属构造函数的 prototype
// 实例化对象也是一个对象
// 实例化对象也有 __proto__ 属性
对象访问机制
// 当访问一个对象成员的时候,如果对象本身有,则直接返回结果,停止查询;
// 如果对象本身没有,就会自动去 __proto__ 上访问,有就返回结果,停止查询;
// 没有的话,再去 __proto__ 上找,一直找到定级对象的 __proto__,都没有则返回undefined
// 每一个函数天生自带一个属性叫做 prototype,是一个对象
// 每一个对象天生自带一个属性叫做 __proto__ 指向所属构造函数的prototype
// 每一个对象,没有准确的构造函数来实例化的时候,我们都看做是内置构造函数 Object 的实例
原型链
// 任何一个对象出发,按照 __proto__ 开始向上查找,
// 最终都鞥找到 Object.prototype,我们把这个使用 __proto__ 串联起来的对象链状结构,叫做原型链
// 原型链的作用:为对象访问机制服务
constructor(构造器)
- 只有函数天生自带的那个 prototype 上才有
- 表示是哪一个构造函数所自带的 原型对象
- 作用:判断复杂数据类型
- 例如:
console.log([].constructor === Array)
判断数据类型
-
typeof
- 准确判断基本数据类型
- 对于复杂数据类型并不准确
- 例:
console.log(typeof '123')
-
constructor
- 利用原型的属性
- 利用对象访问机制
- 例:
console.log([].constructor)
-
instanceof
- 语法:对象 instanceof 构造函数
- 检测基本数据类型不方便
- 例:
console.log({} instanceof Object)
-
Object.prototype.toString.call()
- 语法:Object.prototype.toString.call(需要检测的数据)
- 例:
console.log(Object.prototype.toString.call(123))