js中的原型

来源:互联网 发布:孙玉伯 知乎 编辑:程序博客网 时间:2024/06/05 04:49
  • 一、构造函数
  • function Foo(name, age){    this.name = name;    this.age = age;    this.class = 'class-1';    //  return this  //  默认有这一行  }var f = new Foo('zhangsan', 20);var f1 = new Foo('lisi', 21); //创建多个对象
    new一个对象的过程:一开始this是空,然后对this的name、age属性赋值,然后return this 给 f;
  • 所有的引用类型都有构造函数:
  • var a = {} 其实是 var a = new Object() 的语法糖;
  • var a = [] 其实是 var a = new Array() 的语法糖;
  • function Foo() {...} 其实是 var Foo = new Function(...) ;
  • 使用 instanceof 判断一个函数是否是一个变量的构造函数:例如:变量 instanceof Array
    来判断这个变量是不是数组?
  • 二、原型规则和示例
  • 1.所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(除了null);
  • 2.所有的引用类型(数组、对象、函数),都有一个__proto__(隐式原型)属性,属性值是一个普通的对象
    => 因为第一条说了引用类型可以自由扩展属性,__proto__也是一个引用类型的属性,符合第一条规定;
  • 3.所有的函数,都具有一个prototype属性(显示原型),属性值也是一个普通的对象  => 符合第一条规定;
  • 4.所有的引用类型(数组、对象、函数),__proto__属性值指向它的构造函数的prototype属性值;
  • obj.__proto__ === Object.prototype // true
  • //1-4规则示例var obj = {};obj.a = 100;var arr = [];arr.a = 100;function fn() {}fn.a = 100;console.log(obj.__proto__);console.log(arr.__proto__);console.log(fn.__proto__);console.log(fn.prototype);console.log(obj.__proto__ === Object.prototype);  //  true
    5.当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的__proto__(即它的构造函数的prototype)中寻找;
  • //第5条规则//构造函数function Foo(name, age){  this.name = name;}Foo.prototype.alertName = function(){  alert(this.name);}//创建示例var f = Foo('zhangsan');f.printName = function(){  console.log(this.name);}//测试f.printName();f.alertName();
    所以说f有三个属性:name、printName、alertName;但是当我们循环自身的属性时,只希望得到name和printName属性;
  • //循环属性var item;for (item in f) {    //高级浏览器已经在for in 中屏蔽了来自原型的属性    //但是为了程序的健壮性,加上一个判断    if (f.hasOwnProperty(item)){        console.log(item);    }}