- 原型链与原型
个人理解
每个函数的prototype指向一个对象,这个对象是函数实例的原型。
那什么是原型呢?你可以这样理解:每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。
每个对象都有一个属性__proto__ 指向自己的原型。
//构造函数的原型的构造器就是它本身 有意思。
//根据上面的知识 就有了下面的奇怪的东西
function Person() {}
var person = new Person();
console.log(person.__proto__ == Person.prototype) // true
console.log(Person.prototype.constructor == Person) // true
// 顺便学习一个ES5的方法,可以获得对象的原型
console.log(Object.getPrototypeOf(person) === Person.prototype) // true
最核心的原型链
原型也是个对象,也有__proto__属性,也有构造函数,所以就有了一直往上寻找的直到null
真的是继承吗?最后是关于继承,前面我们讲到“每一个对象都会从原型‘继承’属性”,实际上,继承是一个十分具有迷惑性的说法,引用《你不知道的JavaScript》中的话,就是:
继承意味着复制操作,然而 JavaScript 默认并不会复制对象的属性,相反,JavaScript 只是在两个对象之间创建一个关联,这样,一个对象就可以通过委托访问另一个对象的属性和函数,所以与其叫继承,委托的说法反而更准确些。
扩展练习
先不看书我自己回答下:
undefined表示一个变量自然的、最原始的状态值,就是此处应该有一个值,但是还没有定义。 null表示一个变量被人为的设置为空对象,而不是原始状态,即该处不应该有值;
一个是初始化的默认值,一个是符合语义化(或者场景)的值。比如一个没有苹果的篮子
new对象的过程
function fun(name,age){
let obj = {
name,
age
}
obj.__proto__ = fun.prototype;
return obj;
}
var a = fun('何',27)
console.log(a.name)//自己写的版本 真菜 完全不是个意思
//还有点走题 实现个 new的过程
//new fun() fun是构造函数
function Peo(name,age){
this.name =name;
this.age = age;
}
function myNew(){
//声明一个对象 也就是最后的实例
let obj = {};
//获取到构造函数
Constructor = Array.prototype.shift.call(arguments)
//实例
obj.__proto__ = Constructor.prototype;
//构造器的this指向 实例
Constructor.apply(obj,arguments);
}
let me = myNew(Peo,'he',27)