javascript - 关于原型继承的问题。在这里为什么打印出来的是前一段话,然后就是为什么Person.say是undefined??
迷茫
迷茫 2017-04-10 17:58:17
[JavaScript讨论组]

<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)
天蓬老师

少年郎,我猜你是误解了这个 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
ringa_lee

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

Person = Person.prototype.say=function(){
    console.log('2');
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号