其实简单来说,原型就是一个对象对另一个对象的引用。
然后其是怎么联系起来的呢,是通过prototype。对就是这个,给你一个例子
var obj = {a: 2
}
var myObj = Object.create(obj)
console.log(myObj.a) // 2
console.log(myObj === obj) // false
console.log(Object.getPrototypeOf(myObj) === obj) // true
Object.getPrototypeOf(myObj).a = 4
console.log(obj.a) // 4
通过上面的例子,你可以看到,myObj的原型就是obj!然后obj的原型是哪个呢,是Object.prototype。实际上通过上面,你就能知道,原型原理上是对于另一个对象的引用,通过引用吧几个对象给串联起来调用。
那么你的第二个问题马上又来了,可能也是你关心的问题,类和原型的关系是啥呢?
实际上,类在实例化的时候,也就是通过new来创建一个对象的时候,是分为以下几步的:
创建一个全新的对象
这个新对象会被执行prototype连接
新对象绑定到函数调用的this
如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象
这个就是new实例化的时候,所做的一些步骤,那么你其中有几个需要注意的点:
如果有return并且返回的是一个对象的话,则直接返回return后的那个对象。
反之,则新建一个对象。
并且吧函数的prototype引用到新建对象的prototype中。
这个怎么理解呢?再给你一个例子,可能例子更直观一些:
var protoObj = {b: 10
}
function Foo() {}
Foo.prototype = protoObj
var a = new Foo()
console.log(Object.getPrototypeOf(a) === Foo.prototype) // true
console.log(Object.getPrototypeOf(a) === protoObj) // true
console.log(a.b) // 10
通过这个例子,你可以看出来,实际上类实例化的过程,其中有一项,就是把其构造好的对象的prototype和类的prototype做关联。因为做好了引用关联,所以构造好的对象可以使用原类里面的原型方法。
这个也讲完了,那么你可能会对class比较感兴趣,想知道class是怎么做的,实际上,class更多,我理解上就是上面类似于Foo()类的一种语法糖,当然也不仅仅是语法糖,但是大体原理是没啥区别的,所以,上面所说的,对于class也同样适用
好啦,如果你对原型和类实例化有更多想了解的,可以给你两篇文章,参考一下:
Javascript基础之-原型(prototype)
Javascript基础之-this
每个 JavaScript 对象内部都有一个指向其它对象的“指针”或者 “引用“, 并通过这种方式在对象之间建立了一种联系,形成了一种链式结构,我的理解这就是所谓的原型链。
function F() {} // F 是一个函数,函数也是对象,而且每个函数都有一个属性叫:"prototype"var o = new F() // F.prototype 就是 o 的原型对象
console.log(o.name)
// 输出: undefined
F.prototype.name = "foo"
console.log(o.name)
// 输出: foo
// 上面这个例子是想说明:通过 new 在对象 o 与对象 F.prototype 之间建立了联系, 这个建立联系
// 的方式有人叫 "原型继承" 。 当访问的对象属性不存在时,就会沿着原型链去查找。
讲原型和原型链,如果是讲定义,那很是晦涩难懂,今天我们就通俗易懂的说说原型与原型链。还需要借助阮老师的“Javascript继承机制的设计思想”。
1,比如我们还要针对学生统计每个人的总分是多少,我们改造构造函数Person,构造函数上有个 prototype属性,这个属性就是这个构造函数的原型(显式原型),这个原型是函数特有,prototype对象默认有两个属性,constructor属性和__proto__属性。
2,constructor,这个属性包含了一个指针,指回原构造函数。通过控制台输出,我们可以看到我们实例化的对象,有个__proto__属性,这个属性就是隐式原型,这个__proto__是所有对象都有的属性。
3,由于JavaScript的一切都是对象(除undefined),又由于所有对象都有__proto__属性,__proto__又指向构造函数的prototype,当我们访问一个对象的属性时。
4,如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,于是就这样 一直找下去,也就是我们平时所说的原型链的概念。原型链,说明是链式,而不是环,说明有终点,它的终点是null。