什么是原型?
英文prototype翻译过来就是原型,原型从字面意思上可以理解为事物原本的样子,举一个不太恰当的例子:猴子是人类的原型?o( ̄︶ ̄)o,可见而知事务由原型演变而来,拥有原型的一些特征和功能,比如都有鼻子眼睛,都是灵长类等,演变而来的事物往往还拥有更多功能,比如人类会使用计算机!猴子不会!
那何为JS中的原型?引用数据类型中都存在一个名为__proto__(隐式原型)的值,这个值指向的是其构造函数的prototype(显式原型)属性。prototype值的存在,是为了解决类的问题,一类事物拥有共同的特征和功能,这些特征和功能被存储在原型之中,而prototype就是存放某类对象共有属性与方法的内存空间。
以内存的角度来看原型:
1、构造函数的prototype属性是一个引用数据类型,它被储存在堆空间之中;
2、这个构造函数实例化的对象中包含一个__proto__属性指向的是其构造函数prototype堆空间地址;
3、这样的指向关系避免重复创建共有属性,减少不必要内存占用;
4、任何对象要使用其共有原型方法和属性,可以到依据其__proto__的指向最终找到prototype的堆空间占用;
什么是原型链?
理解了原型。理解原型链就很简单了,原型链就是查找原型的规则,向上逐级查找的方式就像链条一样,故称为原型链,对象查找其共有方法和属性先到其构造函数的原型中找,找不到则到其原型的原型上找,一直找到最终的构造函数Object上为止,此时还找不到说明没有你所查找的原型方法或属性,列个不恰当的原型链条,生物>灵长类>人类>女人>非洲女人,非洲女人想说汉语,由于她本身不会,潜意识就会去看看作为女人本能中有没有说汉语这个功能,如果没有则去看看人类本能中会不会说汉语,再没有则去灵长类本能中查看,一直查看到生物这一层,最终还是没有查询到这个功能,最终返回这个非洲女人不会说汉语。
注意下面代码段,可见function也是一个对象,是构造函数Function创造出的实例,他同时拥有prototype和__proto__属性,意味着在function对象的显示原型里找不到需要的属性,则会到其隐式原型中继续查找;
<scritp>
var add = new Function("num", "alert(num)");
</script>
网友评论