对象的定义、调用
- 三种定义方式:1、
var obj={};
2、var obj=new Object();
3、var obj=Object.create();
- 对象是由其本身和原型构成的,对象的原型是
__proto__
,原型本身也是一个对象,所以就有了原型链
的概念。 - 对象的调用方式
obj.属性名
或者obj['属性名']
- 原型链:原型链是指对象在访问属性或方法时的查找方法。
- 1.当访问一个对象的属性或方法时,会先在对象自身上查找属性或方法是否存在,如果存在就使用对象自身的属性或方法。如果不存在就去创建对象的构造函数的原型对象中查找,以此类推,直到找到为止。如果顶层对象中还找不到,则返回undefined。
- 2.原型链中最顶层为object构造函数的prototype原型对象,给object.prototype添加属性或方法可以被除null和undefined之外的所有数据类型对象使用。
工厂模式
- 这种模式可以防止变量污染1234567891011//例如🐶function Dog(){var obj={};obj.name="大黄";obj.sex="男";obj.action=function(){console.log("吃、撒欢、玩");}return obj;}var myDog=Dog();
ES5构造函数
构造函数的定义、调用、继承(
call
、apply
、bind
)12345678910111213141516171819//约定俗称的首字母大写function Person(name,age){this.name=name;this.age=age;this.hobby=function(){console.log("lala");}}//继承Person的构造函数Studentfunction Student(name,age){Person.call(this,name,age);// 改变this的指向// Person.apply(this,[name,age]);// Person.bind(this)(name,age);this.action=function(){console.log("hhaa");}}var person=new Person("lala",20);new
关键字在此过程中做了哪些东西?
- 创建一个空的对象
var obj={};
- 改变
this
的指向Person.call(this,name,age);
- 给原型赋值
obj.__proto__=person.prototype;
- 还可以通过原型找到构造函数本身
var fn=Person.prototype.constructor;
ES6类
- 出现就是为了取代ES5构造函数,比构造函数更完善一些,但是具有兼容性
- 类的定义、调用、继承
extends、super
123456789101112131415161718class Person{constructor(name,age){this.name=name;this.age=age;}hobby(){console.log("lala");}}class Student extends Person{constructor(name,age){super(name,age);}action(){console.log("haha");}}var person=new Person("lala",20);