js 自定义对象 构造函数的问题

varp=function(options){varopt={};this.init(options);};p.prototype.init=function(optio... var p = function(options){
var opt={};
this.init(options);
};
p.prototype.init=function(options){ };
这个代码有啥问题啊?为啥this.init(options)这句报错,说找不到对象啊?
我这种方法应该没有问题的吧?

主要是全部都写在构造函数里面很乱,所以我想私有方法和私有属性写在构造函数里面,然后其余的用原型定义的方式来给,但是像上面的代码却报错说没有init方法,求解
而且如果更改为:
var p = function(options){
var opt={};
this.init(options);
};
p.prototype={
init:function(options){
opt=$.extend({},options);

},
}
这样的情况,却又说opt没有定义……迷糊了……
求解答,之后再加分!
展开
 我来答
匿名用户
推荐于2016-08-21
展开全部
var p =  function(options){
    this._opt = {};
    //var opt={};
    this.init(options);
};
p.prototype={
    init:function(options){ 
        this._opt=$.extend({},options);
        //opt=$.extend({},options);
    },
}

你漏了 this 关键字。没有 this,所有变量范围全是声明在函数内的。

追问
使用this后
如果var myp=new p();
那么myp中是可以看见_opt这个属性的,但是这个变量应该是需要保护起来的才对。
我知道问题肯定是在作用域范围引起的,但是昨天查了一天都没有找到解决办法(即无法按照p.prototype=...的方式来执行,而只是能按照全部定义在一起的方式来做)
追答
这里只能靠调用约定,所有人都遵循不直接引用对象里名称是下划线开头的属性/方法(所以我才把opt改为_opt,表明这是私有的)的约定(非要调用也没问题,但你不能保证其结果总是调用者预期的,因为这些是私有的,实现者大可以随意改动),你不能真的隐藏起来(其实通过闭包可以,但那不是基于prototype对象原型的):js没有这个可见性级别这个东西,它毕竟不是真的面向对象,只能模拟,隐藏起来意义不大。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式