坑爹的prototype

我想创建一个自己的卡片类,暂时叫GameCard吧,继承createjs的Container类。

然后我就可以传入cardId,在自定义类里自动把卡片的背景图啊、卡片上的图案啊,addChild上去。


于是我百度了一下"js、继承",从得到的答案里找了一个最简单的,写成了这样:

createjs.GameCard = GameCard;
createjs.GameCard.prototype = new createjs.Container();

我new 了一个GameCard,放到舞台上去,嗯,没什么问题。于是我又new了一个,坑爹的事情发生了,第一张卡的样子变成和第二张一样了。。。。


我在把卡片添加到舞台之前,console.log了一下两张卡片,确实是3个不同的卡,id也不一样,那怎么长得一样的呢。

我又去看了一下createjs库内部的displayObject的继承是怎么写的,发现它写了一个函数专门用来继承

createjs.promote = function(subclass, prefix) {
	"use strict";

	var subP = subclass.prototype, supP = (Object.getPrototypeOf&&Object.getPrototypeOf(subP))||subP.__proto__;
	if (supP) {
		subP[(prefix+="_") + "constructor"] = supP.constructor; // constructor is not always innumerable
		for (var n in supP) {
			if (subP.hasOwnProperty(n) && (typeof supP[n] == "function")) { subP[prefix + n] = supP[n]; }
		}
	}
	return subclass;
};

看样子它是把superClass的prototype的每一个属性一一赋给subClass。而不是像我那样直接整个赋过去。

查了一下,原来“prototype的属性将会成为使用这个构造函数创建的对象的通用属性”。而我一开始的写法是prototype直接等于一个COntainer对象,导致我新建的Card子类都指向了这个对象,比如说独有的标识id之类的属性,我猜。导致我操作3个card其实都是在操作同一个Container。

我把卡片的底牌去掉,重新跑了一遍,果然,其实我添加了3遍图片素材在同一张卡上,只不过因为每次都添加了底牌,遮住了上一次的素材。



于是我就照着createjs自己的继承写法,修改了我的代码

createjs.extend(GameCard, createjs.Container);
createjs.GameCard = createjs.promote(GameCard, "Container");

终于正常显示3张牌了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值