js中关于原型、方法相关的内容不同的人理解与记忆的方式各有不一,而官方的说法又是非常难以理解,这里仅记录个人探讨与自己的理解。
首先从数据类型说起
https://editor.csdn.net/md?articleId=106614767
为什么在原型链中最终指向的是基本数据类型null?
null在这里指的是空指针的意思,在js的设计就是如此,让null代表原型链的终点。
原型链是有限长度的,且最终必定都会引用到Object并且指到null为结束
原型与原型链
1.了解普通对象、函数对象、原型对象
参考:https://blog.csdn.net/lxy869718069/article/details/104636429
重要点:3个
- 函数对象是通过 new Function 创建的对象(内置function),其他的都是普通对象
- 所有函数对象(除了一些内建函数)都有一个名为prototype(原型)的属性,这个属性是一个指针,指向一个原型对象(显示原型)
- 所有对象都拥有__proto__属性(隐式原型),但只有函数对象才有 prototype 属性
2.构造函数
理解构造函数本身内容及其结论
function a() {
}
a.prototype.test = function(){
console.log('123');
};
let b = new a();
console.log(b.__proto__ === a.prototype); // true
console.log(a === a.prototype.constructor); // true
console.log(a === b.__proto__.constructor ); // true
实例对象与构造函数之间存在一个恒等式:
-
结论1
b.proto === a.prototype 即实例对象的隐式原型指向构造函数的显示原型 -
结论2:
a === a.prototype.constructor 即每个原型都有一个 constructor 属性指向关联的构造函数,函数对象本身指向该原型的构造函数 -
结论3:推导结论
b.proto.constructor = a 即实例对象的隐式原型的constructor 即为a构造函数本身
3.原型、原型链的个人概念
原型是指拥有(prototype)原型属性的函数或者对象
原型链是指多个原型通过__proto__ 属性相互联系起来的链式结构
原型相关的几个重要属性
- prototype 存在于函数对象中,他指向了这个函数对象的原型对象
- constructor属性存在于原型对象中,他指向了构造函数
- 所有对象都拥有__proto__属性,这个属性保存着构建它的原型以及原型链内容
类与继承
es6引入了 Class(类)这个概念。基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已
es6的写法方式:
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
var p = new Point(1, 2);
es5的写法方式:
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype.toString = function () {
return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1, 2);
两者是等价的
es6中Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多