prototype 一些见解

92 阅读2分钟

认识prototype

1、首先类是通过函数的方式创建的,一个函数即是一个对象,每个函数对象都会存在一个 prototype 子对象,prototype 所表示的就是该函数的原型

2、我们都知道通过 new 关键字可以将函数对象的成员都变成实例化对象的成员;但是 prototype 这个属性仅仅在通过 new 去创建一个实例化对象的时候才会成为实例化对象的属性成员

3、只有一个对象是函数对象时 prototype 才有意义,也只有在这个时候 prototype 才可以被调用

prototype 的作用

prototype 可以让我们动态的在实例化对象或者原函数对象上动态添加属性,

function Person() {
  
}
Person.prototype.name = 'Tom'
Person.prototype.sayHI = function () {
  console.log('hi,i m ',this.name);
};
const person = new Person()
console.log(person.name, person.sayHI()); // Tom hi,i m  Tom
console.log(person.prototype); // undefined

通过上面代码可以发现,通过new 出来的 person 实例化对象可以访问 Person 原对象的属性 但是我们访问实例化对象的 prototype 的时候 会发现是一个 undefined 值;这就是我们上面第二点所说的后半句内容

为什么会没有 prototype 属性?这个时候就要从 new 关键字入手

new 关键字进行的一些列操作(以上面为例)

1、person = {}
2、person.__proto__  = Person.prototype
3、Person.call(person)

'__proto__' 是什么?
__proto__ 是每一个对象创建时在内部初始化个的一个私有属性不对外公开 ;
当外部访问对象属性时,如果对象上不存在那么就会从 __porto__ 上去找,
找不到就会继续往上直至返回 null 为止,这个也就是原型链的概念


所以上例子中我们访问 person 的 name 等属性的时候找不到;
那么就会通过 __proto__ 向上查找,直至在 Person 里面找到了就返回对应的值

给实例化对象添加 prototype 属性继承于 Person 对象

person.prototype = Person.prototype

这样以后 实例化对象就拥有了 prototype 属性并且是继承于 Person 对象的