javascript - 关于js中prototype的问题,如何获取构造函数中的值
ringa_lee
ringa_lee 2017-04-11 13:04:04
[JavaScript讨论组]
        function sub(options){
            options = options || {};
            this.options ={
                name : options.name || 'john',
                age : options.age || '18'
            }
            this.init();
        }
        sub.prototype ={
            constructor:sub,
            init:function(){
                this.getName();
                this.getAge();
            },
            getName :function(){
                sub.prototype.getAge();
            },
            getAge : function(){
                console.log('age:'+this.options.age);   //在getAge这个函数里面怎么取到构造函数sub里面的options值啊
                var ageObj ={
                    init : function(){
                        //console.log('this is age');
                        //console.log('age:'+this.options.age);
                    }
                }
                ageObj.init();
            }
        }
        new sub({
            name : 'lily',
            age : '20'
        });
ringa_lee
ringa_lee

ringa_lee

全部回复(6)
怪我咯

这样不行吗?

<script>
    function sub(options){
        options = options || {};
        this.options ={
            name : options.name || 'john',
            age : options.age || '18'
        }
        console.log("this object",this);
        this.init();
    }
    sub.prototype ={
        constructor:sub,
        init:function(){
            this.getName();
            this.getAge();
        },
        getName :function(){
//            sub.prototype.getAge();
        },
        getAge : function(){
            console.log("which object",this);
            console.log('age:'+this.options.age);   //在getAge这个函数里面怎么取到构造函数sub里面的options值啊
            var ageObj ={
                init : function(){
                    //console.log('this is age');
                    //console.log('age:'+this.options.age);
                }
            }
            ageObj.init();
        }
    }
    new sub({
        name : 'lily',
        age : '20'
    });
</script>

亲测可行

你那个getName方法中的getAge错了,不应该是prototype对象,应该是这个对象本身

高洛峰

这样根本取不到吧,你应该在构造函数里取原型中的方法,子类sub可以获取到父类sub.prototype的方法和属性,父级肯定取不到子的
重新设计下代码吧

怪我咯

问题出在这里

getName :function(){
    sub.prototype.getAge();
},

sub.prototype.getAge();这句表示你把getAge()方法当做普通函数调用了,这样就脱离了原型继承,这个方法又是需要有值的,很显然你这里没有传任何的参数,当然获取不到age,改成这样就行了

getName :function(){
    this.getAge();
},
PHP中文网
function Sub(options) {
    options = options || {};
    this.options = {
        name: options.name || 'john',
        age: options.age || '18'
    }
}

Sub.prototype = {
    constructor: Sub,
    getAge: function() {
        console.log('age:'+this.options.age);
    }
};

var obj = new Sub({
    name: 'lily',
    age: '20'
});

obj.getAge();

// obj通过原型链调用方法getAge(), getAge()中的this应用隐式绑定规则被绑定到上下文对象obj

高洛峰

我觉得主要是逻辑上面有问题。

X.prototype是X的父对象,所以有X.prototype的时候,还没有X呢,更没什么X.options,那X.prototype怎么好用这个options呢?在X.prototype的世界里根本就不应该有这个options,所以不应该出现在X.prototype的内容里。

如果把options作为X.prototype的一个属性就比较自然了。

var parent = {
    options: {
        name: "Father",
        age: 58
    },

    init: function() {
        console.log("which object", this);

        this.getName();
        this.getAge();
    },
    getName: function() {
        console.log('name:' + this.options.name);
    },
    getAge: function() {
        console.log('age:' + this.options.age);
    },
};


var Sub = function (options) {
    this.options = options;

    this.init();
}

Sub.prototype = parent;

var sub = new Sub({name: "Child", age: 28});                                           
天蓬老师

问题已经解决了,这样的确取不到值,换了种调用方法就好了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号