学习js原型笔记

只要是对象,都是属性的集合;普通对象是,函数,数组也是如此。

js是弱类型语言;何为弱类型语言,就是对类型的约束并不强,可以随意改变变量的类型;

例如:

  函数

  function fn() {}

  fn.a = 5;

 

 数组

  let arr = new Array();

  arr.a = 5;

 

对象都是通过函数创建的;

即便是这样的

 const a = {}; // 这种字面量,其实是一张语法糖,内在也是调用函数来创建的;

例如:

 const a = {s: 'sss', f: 'fff'};

 执行的机制是这样的

  const a = new Object();

  a.s = 'sss';

  a.f= 'fff';

 Objec, Array 这两个内置的其实是函数

 可以用typeof来检测

 

每个函数都有一个属性prototype(再次证明函数是一个对象),这个属性指向一个对象,这个对象只有一个属性constructor,这个属性指向函数本身;所以还可以这样调用函数        例如:

function fn(x, y) { console.log(x+y); }

fn.prototype.constructor(2,4);

 

 

prototype的中文翻译叫“原型”;

例如Object函数的原型对象就不止一个属性

有些属性还是我们经常用的;

在原型中添加对象有什么作用呢;

例如:


 function fn() {}
    fn.prototype.a = 'aaaa';
    fn.prototype.b = () => console.log('bbbbb');

    const f = new fn();
    console.log(f.a);

如果这个对象调用某个方法是自己没有的话, 就会沿着“__proto__”上去寻找;

通过在函数的原型中添加属性。然后通过 new 操作符 创建的对象都可以使用这些属性了;不过我自己觉得一样在原型中添加的都是方法较多;方法也是属性,只是绑定了函数而已;

原型对象添加的属性是给实例使用的,函数自己很少使用;

通过函数创建出来的对象都有一个 “隐式原型” __proto__; 一般浏览器是不显示出来的,js也不希望开发者使用这个属性;__proto__指向的对象和prototype指向的对象是一样的;

f.__proto__ === fn.prototype  // true

每个被创建出来的对象的__proto__属性,它指向的都是创建它的函数的prototype;

我把函数称为“函数对象”,对象称为“普通对象”;我把__proto__称为隐式原型,prototype称为显示原型

prototype也是一个对象,是一个普通对象;那它也会有隐式原型(__proto__),__proto__指向哪里呢?

谁创建它就指向谁;普通对象都是函数对象创建的,如果我们没有创建那就是系统创建的,那系统肯定是用Object创建;所以__proto__指向的是Object.prototype;

Object.prototype也是一个普通对象,那它也会有__proto__,那它指向哪里了?如果是让我觉得,应该会是一个循环;不过js设置Object.prototype指向的是null;

也就是说Object.prototype是一个终点了;

对了,函数也是一个对象,所以函数也有__proto__;如果是这样的话,函数也是被创建出来的;那是被谁创建出来的;被Function创建出来的;


 function fn(x, y) {
     return x + y;
   }
   console.log(fn(10, 20));

   等同于
   const fn1 = new Function('x', 'y', 'return x + y');
   console.log(f1(10, 20));

 所以fn1.__proto__ 指向 Function.prototype;Object,Array,都是Function创建的; 而Function.prototype 是一个普通对象,那它也会有__proto__,指向哪里呢?普通对象都指向Object.propotype

那Function是由谁创建的;可以自己测试一下;原型中不是有个contructor属性嘛!它指向的是创建该对象的构造函数;
console.log('Function.__proto__.constructor', Function.__proto__.constructor);

结果:

结果显示Function自己创建了自己,真的是神奇;

 

小结:

  函数对象 有显示原型(prototype),隐式原型(__proto__)

   普通对象 只有隐式原型(__proto__)

  隐式原型(__proto__)指向的是创建该对象的函数的prototype;显示原型(prototype)就是简单的指向一个对象;

 

用instanceof来判断是哪种对象;instance中文翻译:实例;  A instanceof B; A是普通对象/函数对象,B是函数对象;

instanceof的判断规则是这样的: A沿着的__proto__这个线上去;B沿着prototype这条线上去;二者如果能找到同一个引用对象就返回true;

 

 

  

 学的文章:https://www.cnblogs.com/wangfupeng1988/tag/%E5%8E%9F%E5%9E%8B/

posted @ 2021-06-08 11:16  sky-su  阅读(46)  评论(0)    收藏  举报