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