zoukankan      html  css  js  c++  java
  • 【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的特点

    /*
    * 没有块级作用域
    * 函数可以作为返回值
    * 变量可以重复声明和定义
    * 闭包
    * 原型继承
    */
    
  • 相关阅读:
    spring入门
    Page.Load和Page_Load差异
    先写alert('提示语句!') 后写Redirect语句,为什么只是跳转而不显示提示语句框
    session.close() session.clear() session.abandon()区别
    关于用户退出,点击浏览器后退仍可回到原来页面
    SQL将一个表中查询语句插入另一张表中的某一列
    复习
    读取xml文件或者项目文件***.csproj 时,出现给定编码中的字符无效。
    电子公文传输系统 团队作业(五):冲刺总结(第四天)
    缓冲区溢出漏洞实验
  • 原文地址:https://www.cnblogs.com/achievec/p/5898463.html
Copyright © 2011-2022 走看看