您的位置:首页 > Web前端 > JavaScript

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

2016-09-24 23:53 771 查看

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的特点

/*
* 没有块级作用域
* 函数可以作为返回值
* 变量可以重复声明和定义
* 闭包
* 原型继承
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: