构造函数
在JavaScript中,对象可以通过构造函数创建。为了区分构造函数和普通的函数,构造函数采用大驼峰命名,即首字母也大写。
构造函数中通常都会使用this,并且通过 new 执行这个函数,每次new 执行的结果都是不同的对象。
function Person(name, age) {
this.age = age;
this.name = name;
}
const person1 = new Person('Tom', 10);
const person2 = new Person('Jack', 18);
构造函数执行原理
this 在没有实例化(通过new 执行构造函数)时,指向window。实例化之后this指向实例化对象。
- 构造函数函数实例化,相当于函数执行,创建AO对象
AO = {
this: {}
}
- 函数执行,并且将this的属性传入到对象里面
this = {
name: 'Tom',
age: 10
}
- 隐式的返回这个this对象。
如果构造函数中存在return语句。
- return 原始值, 实例化不会受到影响
- 引用数据类型,会将这个引用值return出去。
原型
所有对象都有自己的原型。
构造函数的 prototype
就是对应实例的原型。
可以通过__proto__ 去找原型上面的属性,叫做原型链。
可以通过实例修改原型上面的引用类型。
通过实例修改原型上的原始值,会导致实例改变,原型不会改变。
JavaScript是基于原型的,每个对象拥有一个原型对象,对象以其原型为模板,从原型继承方法和属性。每个实例对象都有一个私有属性(__proto__)指向它的构造函数的原型对象(prototype)。这个原型对象也有自己的原型对象( __proto__),一直向上直到原型对象为null。根据定义,null没有原型,作为这个原型链的最后一个环节。
函数的prototype属性
在JavaScript中,每个函数都是对象,都可以有自己的属性,都有一个特殊的属性原型prototype。 无论函数以何种方式声明,一个javas函数都会有一个默认的属性 prototype。原型上面可以添加属性和方法。在调用函数时,在函数名前面加上 new 前缀,就会返回这个函数的实例化对象。
原型链
原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推,这种关系常被称为原型链,它解释了为何一个对象会拥有定义在其他对象中的属性和方法。准确来说,这些属性和方法定义在Object的构造器(constructor functions)之上的prototype属性上,而非对象实例本身。
一般将实例的属性写在构造函数中,公用的方法写在原型链。对象的原型链在对象创建时就被确定。
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.tSkill = 'JavaScript';
const person1 = new Person('zs', 18);
Person.prototype = {
mSkill: 'css'
}
const person2 = new Person('lisi', 20);
Person.prototype.interest = 'swim';
console.log('person1', person1);
console.log('person2', person2);
person1的原型链在person1创建时就已经确定,之后只能在原型上通过对象的.语法
,在原型上增加或修改属性和方法。
person2创建之前,Person构造函数的原型已经被修改为另一个对象,因此person2的原型和person1的原型是不相同的。
Object.create()
创建一个新对象,使用现有的对象来提供新创建的对象的原型。
第一个参数是创建的对象的原型,第二个参数是创建对象的属性。返回一个对象。第一个参数必须 为对象或者null ,否则就会抛出TypeError。