
1、显式原型:prototype 隐式原型:proto;
2、js对象分为【函数对象】和【普通对象】,_proto_是普通对象的属性,prototype是函数对象才有的属性;
3、prototype指向一块【内存】,内存里有【公用的属性】,而_proto_指向同一块内存;
4、js是【基于原型】的语言,当调用一个对象的的属性时,如果对象没有该属性,就会去找原型的属性,如果没有,则会去找原型的原型的属性,直到最后返回null为止,null没有原型,这种查找方式成为【原型链】;
带着以上四句话去理解这个栗子:
var test = function () { // 函数对象test
this.propA = 'hello';
this.methodA = function() {
return this.propA; // this指向调用methodsA的对象,即objA,objA.propA = ‘hello’
}
}
test.prototype = {
methodB: function() {
return this.propA; // this指向调用test.prototype的对象,即objA
}
}
var objA = new test();
objA.methodA() // hello
objA.methodB() // hello
下面,升级一点难度
一、为什么obj可以调用toString()方法呢?
let obj = {}
obj.toString()
1、js代码运行之前,就存在window对象,该对象有Object属性,window.Object是一个函数对象
2、window.Object这个函数对象具有prototype属性,指向window.Object.prototype对象;
3、window.Object.prototype具有toString()和valueOf()这两个方法;
4、obj.toString() 等价于 obj.toString.call(obj) 等价于 window.Object.prototype.call(obj)

二、由同理可得,arr可以调用push()方法
let arr = []
arr.push(1)

ps:真数组与伪数组区别:
如果一个数组的_proto_直接或间接指向Array.prototype,则是真数组,否则为伪数组
本文介绍了JavaScript中函数对象和普通对象的原型属性,重点解析了_prototype_和prototype的区别,以及原型链的工作原理。通过示例展示了如何通过原型链调用方法。同时,文章还探讨了对象如何调用内置方法如toString(),并解释了调用过程。最后提到了真数组和伪数组的判断依据,并提供了一个关于数组方法push()调用的实例。
567





