原型链

prototype: 原型 构造函数上的属性
proto:原型链 实例对象上的属性
对象的proto保存着该对象的构造函数的prototype test.proto==

  1. function Test(){
  2. }
  3. const test=new Test();
  4. test.__proto__===Test.prototype
  5. Test.prototype 也是对象也会有__ptoto__
  6. 最顶层 Object.prototype.__proto__ //null

Function、Object

Test是Function构造过来的,底层const Test=new Function()

  1. Test.__proto__===Function.prototype
  2. Function.__proto__===Function.prototype //规定是相等的
  1. Object.prototype.__proto__ 原型链的尽头 null
  2. Function.prototype.__proto__ 答案是什么 Object.prototype
  3. 构造函数自身的__proto__是什么 Function.prototype
  4. Object.__proto__ 答案是什么 Function.prototype
  5. Object instanceof Function true
  6. Function instanceof Object true
  7. Function.prototype===Function.__proto__ true

习题

第一题

  1. function Foo() {
  2. getName = function (){ console.log(1) }
  3. return this
  4. }
  5. Foo.getName = function () { console.log(2) }
  6. Foo.prototype.getName = function(){ console.log(3) }
  7. var getName = function (){ console.log(4) }
  8. function getName() { console.log(5) } //存在方法提升
  9. Foo.getName() //2
  10. getName() //4
  11. Foo().getName() //1
  12. new Foo.getName() //有new没有一样 2
  13. new Foo().getName() //console.log(3)
  14. new new Foo().getName(); // 3

第二题

  1. var a = function (){this.b =3;}
  2. var c = new a();
  3. a.prototype.b = 9;
  4. var b = 7;
  5. a();
  6. console.log(b) //3
  7. console.log(c.b) //3 a()直接调用,this指向的是window,也就把全局的b改成了3

第三题

  1. var a = 10
  2. function foo(){
  3. console.log(a)
  4. }
  5. function sum() {
  6. var a = 20
  7. foo()
  8. }
  9. sum() //10
  10. var a = '林一一'
  11. function foo(){
  12. var a = 'foo'
  13. function fo(){ console.log(a) }
  14. return fo
  15. }
  16. function f(p){
  17. var a = 'f'
  18. p()
  19. }
  20. f(foo()) //此处有闭包
  21. //使用 return fo 返回回来,fo() 就是闭包,f(foo()) 执行的参数就是函数 fo,
  22. //因为 fo() 中的 a 的上级作用域就是函数foo(),所以输出就是foo

第四题

  1. var name = '林一一'
  2. var obj = {
  3. name: '林二二',
  4. prop: {
  5. getName: function(){ return this.name }
  6. }
  7. }
  8. console.log(obj.prop.getName()) //undefined
  9. var a = obj.prop.getName
  10. console.log(a()) //'林一一'

第五题

image.png