1.这里a,b,形参obj都指向了同一个对象,a.age最后的值为13的原因你可以想成虽然传的实参为a但是其实和上面a是不同的,它把那条线断开了,上面的a指向依然是age=13,下面的obj指向了age=15,,所以a依然为13,形参obj只不过是传了一个地址值,下面又修改了地址值
2.关于this
如何确定this的值?
- test(): window
- p.test(): p
- new test(): 新创建的对象
- p.call(obj): obj
!3.原型与原型链!
这里可能比较难理解,可以配合图来理解,两个图,可以很好理解。
1.每个函数function都有一个prototype,即显式原型(属性)
2.每个实例对象都有一个__proto__,可称为隐式原型(属性)
3.每个函数function都有一个prototype,即显式原型属性, 默认指向一个空的Object对象
1. 函数的显示原型指向的对象默认是空Object实例对象(但Object不满足)
*/
console.log(Fn.prototype instanceof Object) // true
console.log(Object.prototype instanceof Object) // false
console.log(Function.prototype instanceof Object) // true
/*
2. 所有函数都是Function的实例(包含Function)
*/
console.log(Function.__proto__===Function.prototype)
/*
3. Object的原型对象是原型链尽头
*/
console.log(Object.prototype.__proto__) // null
/*
测试题1
*/
function A () {
}
A.prototype.n = 1
var b = new A()
A.prototype = {
n: 2,
m: 3
}
var c = new A()
console.log(b.n, b.m, c.n, c.m) //1,undefined,2,3
这里其实可以想成重新给A.prototype赋值了,把那条和n=1线断开了,但是b还指着最开始的A,所以结果这样
/*
测试题2
*/
function F (){}
Object.prototype.a = function(){
console.log('a()')
}
Function.prototype.b = function(){
console.log('b()')
}
var f = new F()
f.a() 可以找到
f.b() 不可以找到
F.a() 相当于F变成实例对象,可以找到
F.b() 可以找到
这里最后一张图表示了所有的原型链,一定要背住,并且明白每条线的意义,其实两张图配合来比较,总结一下几点
- Foo.prototype和Function.prototype就是指的空的obj,而空的obj又是Object的实例对象,所以指向Object.prototype,
- 无论Object还是Function都是通过Function构造出来的,
- 函数的显式原型属性是空的obj对象,
- 实例对象的隐式原型指向构造函数的显示原型
ok, 今晚就到这里,最后两道是面试题,慢慢体会,默写一遍图,明天继续。