为了解释这个问题,假设开端履行var person1 = new Person('kevin')。
如不雅对new和apply的底层履行过程不是很熟悉,可以浏览底部相干链接中的文┞仿。
我们回想下new的实现步调:
- 起首新建一个对象
- 然后将对象的原型指向Person.prototype
- 然后Person.apply(obj)
- 返回这个对象
- function Person(name) {
- this.name = name;
- }
- Person.prototype = {
- constructor: Person,
- getName: function () {
- console.log(this.name);
- }
- };
- var person1 = new Person();
也就是说打着构造函数的幌子挂羊头卖狗肉,你看创建的实例应用instanceof都无法指向构造函数!
4.1 动态原型模式
留意这个时刻,回想下apply的实现步调,会履行obj.Person办法,这个时刻就会履行if语句内的内容,留意构造函数的prototype属性指向了实例的原型,应用字面量方法直接覆盖Person.prototype,并不会更改实例的原型的值,person1依然是指向了以前的原型,而不是Person.prototype。而之前的原型是没有getName办法的,所以就报错了!
如不雅你就是想用字面量方犯写?码,可以测验测验下这种:
- function Person(name) {
- this.name = name;
- if (typeof this.getName != "function") {
- Person.prototype = {
- constructor: Person,
- getName: function () {
- console.log(this.name);
- }
- }
- return new Person(name);
- }
- }
推荐阅读
【引自熊建刚的博客】媒介如不雅你已经对JavaScript异步有必定懂得,或者已经浏览过本系列的其他两篇文┞仿,那请持续浏览下一末节,若你还有困惑或者想懂得JavaScript异步机制与编程,可>>>详细阅读
本文标题:JavaScript深入之创建对象的多种方式以及优缺点
地址:http://www.17bianji.com/lsqh/35175.html
1/2 1