原型及原型链
原型及原型链
- 在你调用一个对象的属性的时, 如果自身的没有此属性, 会默认去其原型去查找, 如果有其他语言的基础, 可能会了解 类 方法及属性的概念
构造函数与类
-
函数和类构造函数的概念, 这两个其实讲的是一个东西 类的构造方法
constructor
和构造函数
是同一个东西 -
如果你是初学者,可以理解为构造函数, 类 这类名词,可以理解为是指定一类事物比如说(人),拥有的
公共属性或方法
-
比如说人,人都有一些基本的属性,比如说身高,体重, 也会有一些相同的方法, 跑步, 走路, 吃饭。这些都属于人的公共方法, 如果我同时需要创建1000个"人"就需要用
{name:"名称"}
循环一百次,重复创建方法及属性, 这样会导致很大的问题:内存占用过多, 这个的解决方法就是原型的玩法, 只需要指定公共的方法/属性就可以达到之创建一次就可以重复使用的结果 -
因为方法可能都一样, 但是人的体重身高可能有差别, 构造函数传入的参数,指定的就是 可变的因素。
-
代码示例
构造函数
function Persion(name, age, gender){
? this.name = name
? this.age = age
? this.gender = gender
class Persion {
// 构造函数
? constructor(a, b) {
? this.a = a;
? this.b = b;
}
第一个案例是构造函数的写法, 第二个案例是 class关键字的写法
里面传入的参数是你每次创建一个对象,
是这个对象的属性
let kyle = new Persion("kyle", 19, "男")
console.log(kyle.a);
console.log(kyle.b)
console.log(kyle)
原型
这里可以看到默认继承的是Object
-
如果你有面向对象基础你可以这样理解
- 原型就是 一个类继承的父类,这个讲的就是类的原型
-
如果你没有面向对象基础你可以理解为
-
既然我们说的是Persion类那我以此举例
function Persion2(name, age, gender){ this.name = name this.age = age this.gender = gender } let kyle = new Persion2("kyle", 19, "男"); console.log(kyle)
- 这个
Prototype
就是这个对象的原型, 最早前叫__proto__
- 可以看到如果没有指定要继承的父类, 默认继承的是 Object。
- 这个
-
构造函数的Prototype
-
构造函数的
prototype
其实也算是JS内部的优化策略
-
JS会将类中的方法默认存储在其自身的
prototype
中。 当进行 new 操作的时候会直接赋值给对象的__proto__
属性, 这样对象的__proto__
属性引用的是构造函数的prototype
属性,这样就不存在重复创建。从而达到优化的效果 -
实例代码
class Persion { constructor(a, b) { // 把父级的 constructor 抢过来当做自己的属性来用 this.a = a; this.b = b; } run() { console.log("跑步"); } } console.dir(Persion)
原型链
-
在调用一个对象的方法时,如果
当前对象内
没有此方法, JS会默认去其__proto__
中寻找一层层往上查找直到Object
的__proto__
-
代码实例
class Persion { constructor(a, b) { // 把父级的 constructor 抢过来当做自己的属性来用 this.a = a; this.b = b; } run() { console.log("跑步"); } } let kyle = new Persion(1, 2); console.log(kyle.a); // 1 console.log(kyle.b); // 2 // 这是object原型中的方法, 查看对象是否有`a`属性 console.log(kyle.hasOwnProperty('a')) // true // 这个问题就可以证明他的查找顺序是一层层往父级查找的, 父级没有查询爷爷的属性这就是作用域链 console.dir(kyle) // 查看对象的原型关系