js原型继承学习笔记
function funcA(){ this.a="prototype a";}var b=new funcA();b.a="object a";//原型中是否有key对应的属性function hasPrototypeProperty(obj,key){ return !obj.hasOwnProperty(key) && key in obj;}
原型对象 构造函数
每一个对象的实例都有一个原型属性,该属性指向了构造函数的原型对象。同时一个函数也有一个原型属性,该属性指向该函数的原型对象,
原型对象包含了一个指向构造函数的指针,和定义在该原型上的其他属性
实例的属性可能会覆盖原型的属性,此时可以通过
实例有一个从delete b.a
删除该实例的属性,此时再次调用b.a
则指向的是函数原型的a
属性。Object
继承的hasOwnProperty()
方法,该方法只会在实例中检索属性,而不会在原型对象中查找,b.hasOwnProperty(a)
Object
有一个Object.getPrototypeOf(instance)
方法,可以获取实例的原型对象。Object.getPrototypeOf(b)==funA.prototype
函数表达式
//使用函数表达式,避免递归调用时函数名改变var f=(function f(num){ if(num==1){ return 1; }else{ return num*f(num-1); }});//jquery1.x源码(function( window, undefined ) { //用一个函数域包起来,就是所谓的沙箱 //在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局 //把当前沙箱需要的外部变量通过函数参数引入进来 //只要保证参数对内提供的接口的一致性,你还可以随意替换传进来的这个参数 "use strict"; window.jQuery = window.$ = jQuery;})(window);
闭包
function createFunctions(){ var result=[]; for(var i=0;i<10;++i){ result[i]=function(){ return i; } } return result;}//输出全为10,返回的函数共享同一个闭包作用域中的实例变量icreateFunctions().forEach(function(f){console.log(f())});//10//新的实现function createFunctionsNew(){ var result=[]; for(var i=1;i<=10;++i){ result[i]=function(num){ return function(){ return num; } }(i);//按值传递参数 } return result;}//返回符合逻辑的结果createFunctionsNew().forEach(function(f){console.log(f())});//10
闭包中的this
var name="name of window";var object={ name:"name of object", getName:function inner(){ return function(){ return this.name;//此时访问的是inner的this作用域,找不到是访问global中的name }; }};console.log(object.getName()());//"name of window";//newvar object={ name:"name of object", getName:function inner(){ var innerThis=this; return function(){ return innerThis.name;//缓存外部函数的作用域 }; }};console.log(object.getName()());//"name of object";
js没有块级作用域
function get(count){ for(var i=0;i
js的特点
/** 没有块级作用域* 函数可以作为返回值* 变量可以重复声明和定义* 闭包* 原型继承*/