【09-23】js原型继承学习笔记

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,返回的函数共享同一个闭包作用域中的实例变量i
createFunctions().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";

//new
var 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<count;i++){
        console.log(i);
    }
    console.log(i);
}
get(2);//0 1 2,跟c、Java等不一样

js的特点

/*
* 没有块级作用域
* 函数可以作为返回值
* 变量可以重复声明和定义
* 闭包
* 原型继承
*/

转载于:https://www.cnblogs.com/achievec/p/5898463.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值