关于原型的介绍我就不在写了。因为网上有很多相关的资料,而且也写得非常好。
那么现在我要给你几段我自己写的代码验证你是否掌握了?!
代码1:
function test()
{
}
test.hasOwnProperty("constructor"); // false
test.__proto__.constructor; // Function()
test.prototype.constructor; // test()
你准确知道它们的输出值么?
如果你知道的话就不用看下问了,如果答错了请耐点心看看下文!
就第一段输出来说吧,这段代码说明不管你是什么对象,你都没有constructor这个属性,这样的设计是很合理的。
那么谁有constructor属性呢,答案是原型!你没听错就是原型!你可能会问,为什么只有原型才有呢??
因为你对对象构造是的过程不太清楚,那么就让我们一起来回顾一下其过程吧。耐点心吧~~~~~~
请看代码2:
function test(name)
{
this.name = name;
}
var man = new test(“”hello”);
这段代码大家一定见过类似的,就是用构造函数来返回一个对象。
其过程分为四个阶段:
1)var object = new Object();
2) object.__proto__ = test.prototype;
3) 运行test(name)函数,这是讲object对象传给this,并运行函数
4)返回object对象 // 如果构造函数里有return语句,且return语句返回对象,那么就会将相关对象返回,否则返回this指向的对象
看到了没有,上面根本就没有关于相关的constructor属性的影子,那么js为了模仿类,应该有构造函数属性啊,那么放哪里了,你应该知道了吧,放在原型里了也就是prototypes所指向的对象里了,在此声明,只有作为原型的对象才有constructor属性,不信的话,你可以去验证一下,在此就不多说了!
好了,解决了constructor的问题了!你现在再看代码1相信你已经能答出输出了!
下面还有一段代码:
代码3:
function test(name)
{
this.name = name;
}
var man = new test(“”hello”);
var girl ={name: "美女",
age: "18"
}
man.__proto__=girl;
man.constructor; // Object();
答对了么?!如果打错了,没关系,请把上文再仔细推敲一下!
这段代码里因为constructor的属性改了,所以为了防止信息丢失,所以一般都会加上下面这段代码来补救:
man.constructor = man ;
好了,关于原型掌握的测试就到这里了,如果都会了,相信不管是什么关于原型代码你都能分析的来。末尾再给大家一个题:
test.prototype.__proto__ // [object Object]
test.prototype.__proto__.proto__ // null
答对了么,答错了请在仔细看上文,如果还是不理解,请留言!