命 名 空 间 :管理变量,防止污染全局,适用于模块开发
// 之 前 的 解 决 办 方 (已经不用)--- 命名空间
var org = {
department1 : {
jicheng : {
name : "abc",
age : 123
},
xuming : { }
},
department2 : {
zhangsan : { },
lisi : { }
}
}
(了解即可) 用 法:
org.department1.jicheng.name ; — 简化 — var jc = org.department1.jicheng; jc.name;
-------- 真 正 命 名 空 间 的 用 法 -------
-------- with( object ){ } --------------
作 用: 达 到 简 化 代 码 的 作 用
缺 点: 过于强大,能修改作用域链,造成程序效率低下(es5.0 禁止使用它)
例如:
var org = {
dp1 : {
jc : { name : 'cheng' },
deng : { name : 'xaiodeng' }
},
dp2 : {
wen : { name : 'wen' }
}
}
访问 org.dp1.jc.name
with(org.dp1.jc) { console.log( name ); }
with 的寻找顺序:
先找 自己参数 里的,在找自身所处环境里的,最后在找全局的
// 用 闭包 可以实现变量私有化,不会污染全局
// init ------- 初始化
var name = "laodeng";
var init = (function () {
var name = "jicheng";
function callName () {
console.log(name);
}
return function () {
callName();
}
} () );
// 两个 name 变量互不影响
init();
console.log(name);
零 散 的 知 识 点
实现一个 方法 的 连续调用 ( 模 仿 了 jquery 包里的 链式调用模式 )
var deng = {
smoke : function () {
console.log("i am somking .... xuan cool!!!");
return this;
},
drink : function () {
console.log('i am drinking .... ye cool!! ');
return this;
},
perm : function () {
console.log('i am perming ... cool!!!');
return this;
}
}
deng.smoke() .drink()
// ----> 此时执行完 smoke() 后,return 返回的是 undefined ,无法继续执行
// 当 return this 时是可以执行的
// 若想连续执行函数,必须在每个函数里 重新返回 对象
deng.smoke().drink().perm();
属 性 名 拼 接 问 题
var deng = {
wife1 : {name : ‘xiang liu’},
wife2 : {name : ‘xiao zhang’},
wife3 : {name : ‘xaing meng’},
wife4 : {name : ‘xaing wnag’},
callWife : function (num) { // 实现属性拼接
return this[‘wife’ + num];
}
}
通 常 在 访 问 一 个 对 象 属 性 时 :
一般用法为 : deng.name ------> 实质的隐式转化为 this[ ’ name ’ ]
对 象 的 枚 举 ( 遍 历 ):
-
for in (简化版的 for 循环)
-
hasOwnProperty(过滤性方法)(判断当前属性是不是自身的)
-
in
-
instanceof
遍 历 对 象 属 性
var obj = {
name : ‘123’,
age : 123,
sex : ‘male’,
height : 180,
weight : 75,
proto : {
lastName : ‘deng’
}
}1.( for in ) 遍历 对象中所有 属性,自己手动添加都可以遍历 for (var prop in obj ) { // hasOwnProperty() 判断当前属性是否属于自身的方法 if(obj.hasOwnProperty(prop)) { // 遍 历 对 象 属 性 必须写 obj[prop] ,不能写 obj.prop console.log( obj[prop]); } } 2. in ---> (最不常用的遍历法,但是笔试题常考) // 判断 “ ” (字符串)里的属性是否属于 该对象,是就返回 true, // 不分青红皂白,包括员原型的属性也认为是当前对象的属性 // 注意: 属性要写在 “ ” 里,不加字符串,认为是变量 console.log( " height " in obj); 3. instanceof (经常出现,常考) // A instanceof B --------> A 对象 是不是 B 构造函数 构造出来的 // 看 A 对象的原型链上 有没有 B 的原型,是就 返回 true function Person () { } var person = new Person(); console.log( person instanceof Person ); // 区别 数组 对象 ( toString() 和 call () 方法 ) Object.prototype.toString = function () { // 识别 this,谁调用 toSrting 的 this 就会指向 谁 // 返回相应的结果 } Object.prototype.toString.call();
------------------ t h i s -----------------------
1.函数预编译过程 tihs ——————> window
2.作用域全局里 tihs ——————> window
3. call / apply 可以改变 tihs 指向
4. obj.func; func() 里面的 this 指向 obj–
------------------ arguments ----------------
------------------ function --------------------
- arguments.callee ————————> 指向的是 函数 的 引用(也就是函数本身)
- func.caller ————————> 函数自身拥有的,显示出某个函数被调用的环境
arguments.callee() 示例:
// 求阶乘的函数中,要实现调用自身函数,但是自身的函数却没有函数名,
// 在这样的情况下就找不到函数引用,通过 arguments.callee()来解决
var num = (
function (n){
if( n == 1){
return 1;
}
return n*arguments.callee(n-1);
} (3) )
func.caller 示例:
函数自身拥有的,显示出某个函数被调用时的环境
function test (){
demo();
}
function demo (){
console.log(demo.caller);
}
test();