javascript - js使用原型中的问题
天蓬老师
天蓬老师 2017-04-11 11:57:07
[JavaScript讨论组]
function label () {
    this.dd=0;
    this.ss='';
}
label.prototype.schema=  {
        "name": '哈哈',
        "age": "13",
        "id": 1 ,
        "rank":12
    }
label.prototype.getRank=function (t) {
    var temp=0;
    if(t.schema.hasOwnProperty("rank")){
        temp=t.schema.rank;
    }
    return temp;
}
//实例
var labelObj=new label();
console.log(labelObj.getRank(labelObj))

我有几个小问题想请教一下

  • label.prototype.schema 改写成 label.schema会有影响吗,什么情况下由于影响, 怎么决定我用那种写法?

  • getRank()中可不可以不传参来完成 获取rank?

  • getRank()这个函数 怎么写才看起来更高效 更优雅?

  • 在我编写的过程中,需要对实例化的对象进行大量的赋值、传值、取值,是我设计的有问题吗,感觉总是怪怪的,
    还是本身不太适用原型来操作?

  • 如果初始构造里同时也有getrank()

     function label () {
    this.dd=0;
    this.ss='';
    this.rank=function(){
        ...
    }
}

执行哪个(原型中的?构造函数中的?) 如何执行另外一个不执行的getrank()?

  • 有没有相关推荐的书籍?

我写过的js文件 没人review ,不知道现在自己究竟哪些地方需要提高,希望大家不吝赐教,多多支出我的不足 !

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(5)
伊谢尔伦
function label(){ return this.init.apply(this, arguments); }

// label原型链
label.prototype = {
    // 预定义的属性
    schema: {
        "name": '哈哈',
        "age": "13",
        "id": 1 ,
        "rank":12
    },
    // 初始化方法, label方法定义了由init作为创建方法
    init: function(arg1, arg2){
        this.dd=arg1;
        this.ss=arg2;
    },
    // 定义通用方法
    getRank: function(){
        // 这里的this就是本实例
        // 返回schema.rank, 没有则返回0
        return this.schema.rank || 0;
    }
}


//实例
var labelObj=new label("dd1");
console.log(labelObj.getRank()) // 12
labelObj.schema.rank = 99;
console.log(labelObj.getRank()) // 99

labelObj.dd; // "dd1"
labelObj.ss; // undefined
大家讲道理

1 label.prototype.schema 改写成 label.prototype 会有影响吗?

当然有影响了   按照你的这个套路现在是这样
 label.prototype = {
       schema:{},
       getRank:function(){} 
    }

改了以后 先是这样 label.prototype = schema:{} 然后在label.prototype.getRank = function(){}
相当于

 label.prototype = {
    "name": '哈哈',
    "age": "13",
    "id": 1 ,
    "rank":12,
    getRank:function(){} 
  }
  

2 可以啊 this.schema.rank 就可以啊

3 return this.schema.hasOwnProperty("rank") ? this.schema.rank : ''; 这样可以么?

我感觉也有点怪怪的 关键是不知道具体的需求是什么样的

天蓬老师

问题1: label.prototype.schema 改写成 label.prototype 会有影响吗,什么情况下由于影响, 怎么决定我用那种写法?

label.prototype.schema这种写法保证了 label.prototype还是指向label本身,而label.prototype={}使得label的原型指向了Object的实例化对象,改变了当前原型对象,不建议这种写法,影响嘛前者的constructor属性指向label本身,而label.prototype={}的constructor属性指向Object,导致原型对象不清楚,后面写法最好不要写,虽然从运行来看也不会导致什么问题或者我能力有限没有发现。

问题2 :getRank()中可不可以不传参来完成 获取rank?

可以,getRank可以这么修改:

    label.prototype.getRank=function () {
        var temp=0;
        //因为this是指向当前实例化对象的,所以可以直接调用this来获取schema
        if(this.schema.hasOwnProperty("rank")){
            temp= this.schema.rank;
        }
        return temp;
    }

问题3 :getRank()这个函数 怎么写才看起来更高效 更优雅?

基于问题2的代码:

    label.prototype.getRank=function () {
        //去除temp
        var schema = this.schema;    //可以把this.schema用变量保存起来,减少引擎的查找schema次数
        if(schema.hasOwnProperty("rank")){
            return schema.rank;   //如果rank存在直接返回rank
        }
        return 0;    //如果不存在直接返回0
    }

问题4:在我编写的过程中,需要对实例化的对象进行大量的赋值、传值、取值,是我设计的有问题吗,感觉总是怪怪的, 还是本身不太适用原型来操作?

这个问题职责不明确,回答不了

问题5 :执行哪个(原型中的?构造函数中的?) 如何执行另外一个不执行的getrank()?

如果你在函数内部特添加了getRank方法,这是生成实例化对象时就只当前对象里函数内部的getRank方法,而不执行原型上getRank方法,这涉及到一个原型链的问题,因为当你生成实例化对象后,在对象上调用getRank方法,js引擎会在当前对象的属性上查找getRank方法,如果没有则会向的原型对象上查找,即label.prototype上查找,如果再查找不到,即会到Object.prototype上查找,直到查到不到为止,而在当前对象属性上有getRank方法,所以不会再去往他的原型对象上查找了,可以去看下js的原型链

时间有限

巴扎黑

建议看看《JavaScript高级程序设计》这本书,里面介绍的很清楚、详细。

黄舟

一系列问题机关枪扫射过来

其实你的问题大部分在SF上都可以找到、建议多补补JS的面向对象、百度不到了再拿来问吧

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

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