1、相关知识点

(1)构造函数  (函数名首字母大写表示构造函数)

function Foo(name,age){
this.name = name;
this.age = age;
this.class = 'class';
//return this; 默认有这一行,浏览器帮忙做了
}
var f = new Foo('chenyan',25); // new 执行时,this先变成一个空对象,然后再Foo函数里给this赋值,最后返回this
console.log(f instanceof Foo)
// instanceof 判断函数Foo 是否是变量 f 的构造函数

(2)、构造函数——扩展

var a={} 其实是 var a = new Object()的语法糖;

var a=[] 其实是 var a = new Array() 的语法糖;

function Foo(){} 其实是 var Foo = new Function();

强烈推荐使用前者写法。

2、原型规则和示例

(1)、所有的引用类型(数组,对象,函数)都具有对象特性,即可自由扩展属性(null除外)

var obj = {};
obj.a = 100;
var arr = [];
arr.a = 100;
function fn() {};
fn.a = 100;

(2)、所有的引用类型(数组,对象,函数)都有一个_proto_(隐式原型)属性,属性值是一个普通对象(null除外)

console.log(obj._proto_);//浏览器默认
console.log(arr._proto_);//浏览器默认

(3)、所有的函数都有一个prototype属性(显式原型),属性值也是一个普通对象

console.log(fn.prototype);//浏览器默认

(4)、所有引用类型(数组,对象,函数)的_proto_属性值 指向它的构造函数的prototype属性值。

console.log(obj._proto_ === Object.prototype);
//Object 是 obj的构造函数

(5)、当试图得到一个对象(引用类型)的某个属性值时,如果这个对象本身没有这个属性,那么会去它的_proto_(即它的构造函数的prototype)中寻找

//构造函数
function Foo(name, age){
this.name = name;
this.age = age;
}
Foo.prototype.alertName = function(){console.log(this.name)};
//创造实例
var f = new Foo("chenyan",25);
f.printAge = function(){console.log(this.age)};
//测试
f.printAge();
f.alertName();//alertName() 不是 f 的自身属性,去 f 的构造函数的prototype 中找;f 继承了构造函数的属性

问题:如何去掉来自原型的属性?

var item;
for( item in f){
//高级浏览器已经在for in 中屏蔽了来自原型的属性
//建议加上这个判断,保证程序健壮性
//hasOwnProperty 获取对象自身属性
if (f.hasOwnProperty(item)) {
console.log(item);
}
}

3、原型链
f.toString() 去f._proto_(Foo.prototype)._proto_(Object) 中找

4、instanceof

用于判断引用类型属于 哪个构造函数的方法

var arr=[];
console.log(arr instanceof Array);

f instanceof Foo 的判断逻辑:

  f 的_proto_ 一层一层往上找,能否对应到Foo.prototype

  再试着判断 f instanceof Object

5、一些题目

(1)、如何判断一个变量是数组类型

var arr=[];
console.log(arr instanceof Array);//true
console.log( tyopeof arr);// Objecct typeof无法判断是否是数组

(2)、写一个原型链继承的例子

最新文章

  1. archlinux 安装手记
  2. 《转》python线程池
  3. 当jquery ajax遇上401请求
  4. mybatis 下划线转驼峰配置
  5. c指针提高
  6. 在Windows 7下面IIS7的安装和 配置ASP的正确方法
  7. 2016 系统设计第一期 (档案一)MVC a标签 跳转 Html.ActionLink的用法
  8. About USB Data Link Cable API
  9. Seek the Name, Seek the Fame(Kmp)
  10. php 汉字转换成拼音
  11. Netty笔记——技术点汇总
  12. BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor
  13. Linux和Uboot下eMMC boot分区读写
  14. Java虚拟机JVM相关知识整理
  15. [PHP] 数据结构-单链表头插法PHP实现
  16. luogu P1943 LocalMaxima_NOI导刊2009提高(1)
  17. 基于GTID环境的数据恢复
  18. How to properly release Excel COM objects
  19. Python - matplotlib 数据可视化
  20. js和java判断值为空的方式

热门文章

  1. Adjacency matrix based Graph
  2. VScode编辑器使用
  3. JDK无法卸载问题解决
  4. 第一次实验: CC2530平台上电源管理与休眠
  5. python的面试问题
  6. 简述grub启动引导程序配置及命令行接口详解
  7. js+ajax编码三级联动
  8. git 安装部署教程
  9. Iterator迭代器UML类图
  10. 使用Python matplotlib做动态曲线