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); }}
阅读全文
0 0
- JS中的原型
- JS中的原型
- js中的原型
- JS中的原型链
- JS中的原型类
- js中的原型链
- js中的原型链
- js中的原型理解
- js中的原型
- JS中的prototype原型
- js 中的对象原型
- JS中的原型详解
- js中的原型
- js中的原型链
- js中的原型链
- js中的原型链
- Js中的原型继承和原型链
- js中的原型及原型链
- Java web学习笔记之servlet技术
- 单调队列学习
- 编辑距离问题
- HDU 6103 Kirinriki【尺取法】【思维题】【好题】
- Oracl安装在Windows中
- js中的原型
- 详细了解步进电机的最大静转矩以及矩频特性
- Bomb Game
- 为什么存储过程比sql语句效率高?
- 深入理解Spring系列之八:常用的扩展接口
- jar包部署到Linux服务器
- sqlserver
- JSP知识点总结
- 2017年8月10号提高组T2 飞行