有这样一道面试题,不知道我答对了没

称是昵称的称 2014-02-25 09:47:20
请用JavaScript编写一个Car类,包含:
一个属性pertrol,表示车辆目前剩余的汽油
方法run,每调用一次,汽车的pertrol含量就会减一
方法clone,用于深度复制Car对象
方法cloneCount,用于获取clone的次数,使用clone方法复制得到的对象的cloneCount应被重置为0。
请考虑Car类可能会被继承的情况下的最优方案

以下是我的答案,总觉得似乎哪里有点问题(尤其是深刻复制那里),请大家有时间指教一下
function Car(pertol){
this.count = 0;
this.pertol = pertol;
}
Car.prototype.run = function(){
this.pertol = this.pertol - 1;
return this.pertol;
}
Car.prototype.cloneCount = function(){
return this.count;
}
Car.prototype.clone = function(c){
this.count = this.count+1;
var that = this;
var c = c || {};
for(var i in that){
if(typeof that[i] === 'object'){
c[i] = Object.prototype.toString.apply(that[i]) === '[object Array]'? [] : {};
arguments.callee(c[i]);
}else{
c[i] = that[i]
}
}
c.count = 0
return c;
};
var car1 = new Car(100);
car1.run();
car1.run();
console.log(car1.pertol);
console.log(car1.clone());
console.log(car1.cloneCount());
...全文
478 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
大神送一血 2014-03-10
  • 打赏
  • 举报
回复
var car = function() {
    this.ipertrol = 100;
    this.cloneNum = 0;
};

car.prototype.run = function() {
    if(this.ipertrol != 0) {
        this.ipertrol--;
    }
};

car.prototype.clone = function() {
    var srcCar = this;
    srcCar.cloneNum++;

    var cloneObj = function(srcObj) {
        if(typeof(srcObj) != 'object') return srcObj;
        if(srcObj == null) return srcObj;

        var myNewObj = new Object();

        for(var i in srcObj)
            myNewObj[i] = cloneObj(srcObj[i]);

        return myNewObj;
    }

    var newCar = cloneObj(srcCar);
    newCar.cloneNum = 0;
    return newCar;
}
克隆这个主要考引用吧。如果单纯用return new Car(this.pertol);肯定会在这个类增加引用类型的成员变量的时候出现错误。所有它的实例都会共享这个引用类型的成员变量。
zhjdg 2014-03-06
  • 打赏
  • 举报
回复
function Car(pertrol){
	this.pertrol=pertrol;
	arguments.callee.prototype.clonenum++;	
}
Car.prototype={
		construtor:Car,
		run:function(){
			this.pertrol--;
		},
		cloneCount:function(){
			return this.clonenum;
		},		
		clonenum:0
}
Car.clone=function(target,obj){
	$.extend(true,target,obj);
	target.clonenum=0;
	return target;
}

var $c1 = new Car(100);
var $c2 = new Car(200);
var $num = $c1.cloneCount();
var supCar = {
		gao:'lihaideche'
}
Car.clone(supCar,$c1);
var $s = supCar;
var $c3 = new Car(300);
x372563572 2014-03-06
  • 打赏
  • 举报
回复
引用 7 楼 u013769319 的回复:
[quote=引用 6 楼 x372563572 的回复:] Car.prototype.clone = function(){ return new Car(this.pertol); }
解决了!我忘记了一个浅显的规则,复制或者深刻复制都是要从实例着手的!非常感谢![/quote] 求分
称是昵称的称 2014-03-05
  • 打赏
  • 举报
回复
引用 6 楼 x372563572 的回复:
Car.prototype.clone = function(){ return new Car(this.pertol); }
解决了!我忘记了一个浅显的规则,复制或者深刻复制都是要从实例着手的!非常感谢!
x372563572 2014-02-28
  • 打赏
  • 举报
回复
Car.prototype.clone = function(){ return new Car(this.pertol); }
称是昵称的称 2014-02-25
  • 打赏
  • 举报
回复
引用 2 楼 u011461314 的回复:
这话啥意思 方法cloneCount,用于获取clone的次数,使用clone方法复制得到的对象的cloneCount应被重置为0。
就是说这个对象被深刻复制后,返回的新对象的cloneCount属性的值应该为0. 但是这个对象应该是Car的实例呢?还是Car本身?who能帮我解开疑惑?谢谢!
zhjdg 2014-02-25
  • 打赏
  • 举报
回复
这话啥意思 方法cloneCount,用于获取clone的次数,使用clone方法复制得到的对象的cloneCount应被重置为0。
称是昵称的称 2014-02-25
  • 打赏
  • 举报
回复
我很想知道的是,要求中是这样: 方法clone,用于深度复制Car对象 那么clone方法是不是应该作为静态方法添加给Car,而不是原型方法(公有方法)? 有时间请指教,谢谢~
zhjdg 2014-02-25
  • 打赏
  • 举报
回复
总觉的,这个问题有点传地址,传值的意思。 使用clone方法复制得到的对象的cloneCount应被重置为0 在什么情况下cloneCount会变化?? 这cloneCount有什么用?
称是昵称的称 2014-02-25
  • 打赏
  • 举报
回复
请讨论一下吧,困惑我挺久的。。。。

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧