>[success] # 到底什么是js的对象 ~~~ 1.例如'Java'/'Python' 中都有面向对象的概念,简单的解释就是创建类 ,通过类声明'实例'或者叫'对象' 2.这个解释用在'js'上也可以说的通,但我个人认为是配配合'es6'来理解 说的通,因为'es6' 有了'class' 这个语法糖,让原本'js'抽象的类理解起来。 不在那么抽象 3.'js'的类是通过原型链,和其他语言是不同。下面'es5' 中类的写法会让人 迷茫'js'类和'js'的方法到底有什么区别,这个new和不new又有什么讲究? function fPerson(){ this.name = 'wang1'} function Person(){ this.name = 'wang'} fPerson() console.log(name) // wang1 var per = new Person() console.log(per.name) // wang 4..js 函数中有两个不同的内部方法:'[[Call]]' 和 '[[Construct]]' 当通过'new' 关键字调用函数的时候,执行的是'[[Construct]]', 负责创建实例对象,然后执行函数体,将'this'绑定在实例上,如果不 通过'new' 创建,调用'[[Call]]' 直接执行函数体代码,具有 '[[Construct]]' 方法函数叫构造函数 ~~~ >[success] # 原型模式 ~~~ 1.js 中并没有类的概念,所谓的'类'的概念只是因为写法上和具有 类概念的语言相似被误认为js 是具有'类'的概念 2.js 是原型模式,用书里的话来说'原型编程的思想中,类并不是必须的', '对象未必需要从类中创建而来,一个对象是通过克隆另外一个对象所得到的' 3.原型模式:不单是一种设计模式,也被称为一种编程泛型,从设计角度来说, 原型是一种创建对象的一种模式 4.如果A对象是从B对象克隆来的,难么B对象就是A对象的原型,js 中'Object'就是 所有对象的原型,那么也可以最简单的理解所有对象都克隆了一份'Object' 5.克隆并不真的去复制一个原型对象,而是使得新对象持有一个原型的引用 ~~~ >[danger] ##### Object 即是对象也是构造函数 ~~~ 1.'类'的定义是一个私有属性 [[class]],语言标准为内置类型诸如 Number、String、Date 等指定了 [[class]] 属性,以表示它们的类。语言使用者唯一可以访问 [[class]] 属性的方式是 Object.prototype.toString。 // 举个例子 const obj = Object(); console.log(typeof obj); // object console.log(typeof Object); // function ~~~ ~~~ function outTypeName(data, type) { let typeName = Object.prototype.toString.call(data) console.log(typeName) } outTypeName(Object) //[object Function] outTypeName(String) // [object Function] outTypeName(Number) // [object Function] ~~~ * 使用Symbol.toStringTag 创建自己'toString' 返回类型 ~~~ 1.es6新增'Symbol.toStringTag'属性可以让自己定义的类也有属于自己的标签定义, 参考文章'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag' ~~~