关于原型继承的问题。在这里为什么打印出来的是前一段话,然后就是为什么Person.say是undefined??

<script type='text/javascript'>

function Person(name){
    this.name=name;
    this.say=function(){console.log('我说话了!');}
}

Person.prototype.say=function(){
    console.log('我不是Person说的话,我只是继承了他的原型里面的说话功能!');
}

var person=new Person();

person.say();

console.log(Person.say);
console.log(Person.prototype.say);

</script>

阅读 2.3k
2 个回答

少年郎,我猜你是误解了这个 this 了吧...
建议你看下这里
也顺便安利下我读《JavaScript 高级程序设计》第六章的笔记 ~= ̄ω ̄=~

1. 第一个问题是因为在查找一个属性(或方法)时,首先当然先搜索对象实例自身,如果没找到再继续搜索 [[prototype]] 指针指向的原型对象,如果找不到再向上查找...

  • 所以实例的属性(方法)可以“屏蔽“原型链上的同名属性(方法)。(通过 delete 可以删除实例属性,消除屏蔽)

  • 在这里就是因为先找到了通过构造函数添加的实例方法 say,从而结束的搜索,就好像“屏蔽”了原型链上的方法一样╮(╯_╰)╭

2. 第二个问题:为什么是 undefined

  • this.say=function(){console.log('我说话了!');} 这句的意思不是把 say 这个方法加到 Person 上。

  • Person 是一个构造函数,可以通过 new 进行实例化,在这里经历了4个阶段

    • 创建一个新对象

    • 将构造函数的作用域赋给新对象(this 指向新对象)

    • 执行构造函数中的代码(为之添加属性,在这里是给 person 添加 name 属性和 say 方法)

    • 返回新对象

  • 当然你也可以不使用 new 进行实例化,直接进行调用的话,this 指向了 window 对象,并为其添加属性和方法:

  // 当作普通函数使用
  Person("steve"); // 添加到 window 对象中
  window.say();    // 我说话了!
  window.name;     // steve

第一个console用person,因为Person不是一个对象
覆盖的话需要这样

Person = Person.prototype.say=function(){
    console.log('2');
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题