继承模式、命名空间、对象枚举

博客围绕JavaScript展开,探讨闭包的私有化变量问题,介绍命名空间可管理变量、防止污染全局变量,适用于模块化开发。还提及方法连续调用的实现,以及对象枚举,包括for in、hasOwnProperty、in、instanceof等操作及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//圣杯模式 继承***!!! function inherit(Target, Origin) { function F() {}; F.prototype = Origin.prototype; Target.prototype = new F(); //上面两句千万不能颠倒 Target.prototype.constructor = Target; Target.prototype.uber = Origin.prototype; //uber相当于super,但super是保留字 } Father.prototype.lastName ="deng"; function Father(){ } function Son(){ } inherit(Son,Father); var son = new Son(); var father = new Father();

封装继承最优算法:

        //圣杯模式  继承***!!!
        var inherit = (function(){
            var F = function(){};
            return function (Target, Origin) {
            F.prototype = Origin.prototype;
            Target.prototype = new F();
            //上面两句千万不能颠倒
            Target.prototype.constructor = Target;
            Target.prototype.uber = Origin.prototype; //uber相当于super,但super是保留字
        }
        }());

 闭包的私有化变量问题:

// 闭包的私有化变量问题
        function Deng(name,wife) {
            var prepareWife = "xiaozhang";//私有只有自己可以访问

            this.name = name;
            this.wife = wife;
            this.divorce = function (){
                this.wife = prepareWife;//私有变量不用加this访问
            }
            this.changePrepareWife = function(target){
                prepareWife = target;
            }
            this.sayPraprewife = function(){
                console.log(prepareWife);
            }
        }
        var deng = new Deng('deng','xiaoliu');

命名空间

管理变量,防止污染全局变量,适用于模块化开发

var org = {
            department1 : {
                jicheng:{
                    name:"vac",
                    age: 123
                },
                xuming:{

                }
            },
            department2 : {
                zhangsan: {

                },
                lisi:{

                }
            }
        }
        var jicheng = org.department1.jicheng;
        // 然后就可以通过jicheng.name来访问了

划重点:定义命名空间最好的方式如下

        var name = 'bcd';
        var init = (function(){
            var name = 'abc';//这个name和外面的name不冲突
            function callName(){
                console.log(name);
            }
            return function(){
                callName(); //这个函数在外面使用时,自带上下文,不污染全局变量
            }
        }())
        init();        

 如何实现方法的连续调用?

// JQuery的用法
        $('div').css('background-color','red').width(100).height(100).html(123).css('position','absolute').
        css('left','100px').css('top','100px');
        // 如何像JQuery这样实现方法的连续调用?
        var deng = {
            smoke: function(){
                console.log('Smoking...');
                return this; //重点在这里,返回对象
            },
            drink: function(){
                console.log('drinking...');
                return this;
            },
            perm: function(){
                console.log('preming...');
                return this;
            }
        }
        deng.smoke().drink().perm().smoke().drink();

对象的枚举

for in 

        var obj ={
            name : '13',
            age:121,
            sex:'male',
            height:180,
            weight:75
        }
        for(var prop in obj){
            console.log(prop + " " +typeof(prop));
        }
        // 遍历对象属性名,都是字符串类型的!!

name string
age string
sex string
height string
weight string

var obj ={
name : '13',
age:121,
sex:'male',
height:180,
weight:75
}
for(var prop in obj){
console.log(obj.prop + " " +typeof(prop) + obj[prop]); //undefined string "121"
}
// 遍历对象属性名,都是字符串类型的!!obj.prop ---undefined

 注意:for in 遍历对象,会把原型链上的人为定义的属性也拿出来;

        var obj ={
            name : '13',
            age:121,
            sex:'male',
            height:180,
            weight:75,
            __proto__: {
                lastName: 'deng'
            }
        }
        for(var prop in obj){
            console.log(obj[prop]); //会把原型链上人为定义的属性拿出来
        }

 

hasOwnProperty

        var obj ={
            name : '13',
            age:121,
            sex:'male',
            height:180,
            weight:75,
            __proto__: {
                lastName: 'deng'
            }
        }
        for(var prop in obj){
            if(obj.hasOwnProperty(prop)){   //取自身的变量
                console.log(obj[prop]); 
            }            
        }

 

 

        var obj ={
            name : '13',
            age:121,
            sex:'male',
            height:180,
            weight:75,
            __proto__: {
                lastName: 'deng'
            }
        }
        Object.prototype.abc = '123';
        for(var prop in obj){
            if(!obj.hasOwnProperty(prop)){   //取自身的变量
                console.log(obj[prop]); 
            }            
        }

 

 

in

 

判断该字符串是否是该对象的属性名,是为true,否为false;

但是注意:

父亲的属性,也会被判断为是自己的。

instanceof

 A instanceof B //A对象  是不是  B构造函数构造出来的

 //看A 对象的原型链上 有没有B的原型

 

转载于:https://www.cnblogs.com/zhizhi0810/p/10575424.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值