原型和原型链

构造函数

在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指向实例化对象。

  1. 构造函数函数实例化,相当于函数执行,创建AO对象
AO = {
  this: {}
}
  1. 函数执行,并且将this的属性传入到对象里面
this = {
  name: 'Tom',
  age: 10
}
  1. 隐式的返回这个this对象。

如果构造函数中存在return语句。

  1. return 原始值, 实例化不会受到影响
  2. 引用数据类型,会将这个引用值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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值