
书上介绍了动态原型模式的代码如下:
function Person(name,age,job) { //property this.name = name; this.age = age; this.job = job; //method if(typeof this.sayName != "function") { Person.prototype.sayName = function() { console.log(this.name); } //Person.prototype = { // sayName: function() { // console.log(this.name); // } //} //这样的写函数的方式报错说没有 sayName 这个函数 } } 当我用注释的 sayName 写法时会提示找不到 sayName 这个函数,为什么?? 两种方式有什么异同吗?我记得书上提过第二种只是对第一种声明变量多的简便写法。 1 judasnow 2016 年 7 月 11 日 你直接把 prototype 给覆盖了。放到构造函数外面就行了。 |
2 Parabolazz 2016 年 7 月 11 日 你看高程 156 页,用对象字面量的方法相当于重写了整个原型。切断了构造函数和最初的原型之间的联系。 我的理解是你这时 new 一个新实例,实例的原型并没有 sayName 方法,因为 sayName 方法保存在新的原型对象上了。 |
3 shyling 2016 年 7 月 11 日 via iPad 把注释的部分放到 Person 外面 |
4 coolzjy 2016 年 7 月 11 日 |
6 songz 2016 年 7 月 11 日 Person.prototype.sayName |
7 learnshare 2016 年 7 月 11 日 不要覆盖 prototype ,用 #6 的方式,扩展 prototype 。 |
8 palmers 2016 年 7 月 11 日 据我的分析是这样的: 你注释的内容改变了对象的原型对象, 所以,通过 Person `new`操作符实例化的对象的原型是 Object 不再是 Person.prototype 了,然而, sayName 函数并不在 Person 对象的原型上,所以找不到,注释代码中 sayName 函数实际上是在通过 new Person()得到的对象的构造函数的原型上,也就是 Person.prototype.constructor.__proto__ ; |
9 Cytrs 2016 年 7 月 12 日 之前刚好看到了一篇文章 https://segmentfault.com/a/1190000000602050 |
10 Sparetire 2016 年 7 月 12 日 准确说应该是创建的第一个对象没有 sayName 方法,之后创建的对象都有 sayName 方法,可以试试 因为创建第一个对象的时候的原型对象没有 sayName 方法,之后每次创建对象都重写了原型,且这些原型都有 sayName 方法,所以只有第一个对象没有 sayName ,之后的都有 |