JavaScript api心得 面向对象编程部分原型链与new关键字(写得比较散,欢迎纠正错误)

构造函数与new

构造函数

​ 一个用来实例化对象的函数,为了与普通函数区分,构造函数名字第一个字母通常大写

new命令

​ 通过此命令让构造函数生成一个实例对象(总是返回一个对象,如果构造函数中有return

​ 并且为对象,那么返回return的对象,如果有return但不是对象,则忽略)

new命令的执行过程

1.创建一个新的对象作为要返回的实例对象 var obj = {} (这步在代码上讲被第二步包含)

2.构造函数的prototype属性作为实例的原型对象 obj = Object.create(Constructor.prototype)

3.将新对象赋值给构造函数的this关键字 Constructor.apply( newObj )

4.执行构造函数,返回实例对象

执行构造函数是为了给实例对象赋予属性(成员变量),而实例对象的方法和类属性则要在获取时从原型链中自己的prototype里面拿到

//实例会'继承'(沿着原型链向上查找)prototype的所有方法和属性包括constructor
/*
	let newObj = Object.create( obj )根据一个实例对象作为模板,
	创建一个实例对象,
	新对象的原型对象就是obj
	Object.getPrototypeof(newObj) === obj
*/
var context = Object.create(constructor.prototype);
//执行构造函数
var result = constructor.apply(context, args);
return result;

对象的继承

在自己里面找不到的类属性或方法,会去原型中寻找,如果找不到,则再去原型的原型中寻找直到找到后返回或找不到返回undefined(沿着原型链向上查找)

例:

​ 在实例对象内是没有原型对象所附加的公共方法的,但会沿着原型链向上查找,在找到原型对象的方法后返回

prototype属性

​ 每个函数都拥有一个prototype属性,指向一个对象,对于构造函数来说,生成实例的时候,该对象会自动成为实例对象的原型,为这个属性添加函数相当于为所有实例添加共用的方法(方法本来就该对象共用,除了一些特例)

原型对象的作用

​ 原型对象的作用,就是定义所有实例对象共享的属性和方法

原型链

​ 由于原型对象也是对象,所以它也有自己的原型。因此,就会形成一个“原型链”

Object.prototype的原型是null,也是链子的尽头

var MyArray = function () {};
//为构造函数的原型赋值为数组对象,这个原型拥有数组的方法,可以作为实例对象的方法
MyArray.prototype = new Array();
//构造函数默认的prototype属性默认的constructor就是构造函数本身,但是一旦手动将prototype
//赋值为新对象,就没有了默认构造函数
//故,改变原型的同时需要同时改变constructor构造函数属性
MyArray.prototype.constructor = MyArray;

var mine = new MyArray();
mine.push(1, 2, 3);
mine.length
mine instanceof Array
constructor构造函数属性

prototype对象有一个constructor属性,默认指向prototype对象所在的构造函数。

constructor属性表示原型对象与构造函数之间的关联关系,如果修改了原型对象,一般会同时修改constructor属性,防止引用的时候出错。

instanceof

instanceof运算符返回一个布尔值,表示对象是否为某个构造函数的实例。

var x = [1, 2, 3];
var y = {};
x instanceof Array // true
y instanceof Object // true

var d = new Date();
d instanceof Date // true
d instanceof Object // true

​ 如果instanceof左边对象的原型是null则会失真 , 左边本身是null则返回false

var obj = Object.create(null);
typeof obj // "object"
//Object.create返回对象,自然是Object的实例
Object.create(null) instanceof Object // false 失真

​ 注意,instanceof运算符只能用于对象,不适用原始类型的值。

var s = 'hello';
s instanceof String // false
构造函数的继承

​ 构造函数也可以继承自另一个构造函数

子构造函数(Sub) 父构造函数(Sup)

function Sub(value) {
Sup.call(this , value);//this.supProp = value.supProp
this.props = value.subProp;
}

//创建新对象的原因是直接改变Sup.prototype.constructor会导致父构造函数改变
Sub.prototype = Object.create(Sup.prototype)//sub的原型对象是sup的原型对象所创造的实例对象
Sub.protoytpe.constructor = Sub
/*
	这样做之后
	sub对象的属性是sup变量加上自己的变量(类变量仍要去原型链中寻找)
	sub对象的原型就是一个sup对象,而sup对象的原型仍是自己的原型

*/
多重继承
模块

https://wangdoc.com/javascript/oop/prototype.html#prototype-%E5%B1%9E%E6%80%A7%E7%9A%84%E4%BD%9C%E7%94%A8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值