2

首先,我以咖啡脚本网站上的动物为例。

我想用javascript模拟接下来的事情:

  • 课程
  • 仅限公共方法
  • 仅私有方法和变量
  • 遗产
  • 从超类调用方法

我认为这种创建方式是可以的,但是当我尝试move从父类获取方法时,它总是返回到自身。我做错了什么?

顺便提一句。哪些是实现我的目标的最佳实践?我在做什么对吗?

var Animal = (function() {
    function Animal() {}

    var _private = {};
    var _public = {
        move: function() {
            console.log('Can move');
        }
    };

    Animal.prototype = _public;
    Animal.prototype.constructor = Animal;
    return Animal;
})();

var Snake = (function(_super) {
    function Snake() {}

    var _private = {};
    var _public = {
        move: function() {
            console.log(Snake._super_.move);
            console.log('Slithering');
        }
    };

    Snake.prototype = _super.prototype;
    Snake._super_ = _super.prototype;
    for(var method in _public) {
        if(Object.prototype.toString.call(_public[method]) === '[object Function]') {
            Snake.prototype[method] = _public[method];
        }
    }
    return Snake;
})(Animal);

var s = new Snake;
s.move();
4

2 回答 2

3

在我看来,这是写得非常好的代码,只有一个小错误。

我认为你的指针有点交叉,试试这个:

<script>
var Animal = (function () {
    function Animal() { }

    var _private = {};
    var _public = {
        move: function () {
            console.log('Can move');
            //this just returns a string to show which method was called
            //inside of the child's move function's console.log
            return "super move called";
        }
    };

    Animal.prototype = _public;
    Animal.prototype.constructor = Animal;
    return Animal;
})();

var Snake = (function (_super) {
    function Snake() { }

    var _private = {};
    var _public = {
        move: function () {
            console.log(Snake._super_.move());//Now we can call super's move
            console.log('Slithering');
        }
    };

    //This created the circular reference where Snake._super_ was pointing to
    //Snake.prototype which was causing the error
    //Snake.prototype = _super.prototype;
    Snake._super_ = _super.prototype;

    for (var method in _public) {
        if (Object.prototype.toString.call(_public[method]) === '[object Function]') {
            Snake.prototype[method] = _public[method];
        }
    }
    return Snake;
})(Animal);

var s = new Snake;
s.move();//now this outputs "Can move", "super move called", "Slithering"
</script>
于 2012-11-21T20:42:42.893 回答
3

如果您要求最佳实践,我会说在网络上采取任何现成的解决方案。我更喜欢这个:http ://canjs.us/#can_construct 。

关于您的方法的一些注意事项:

  1. 它不可重复使用。您必须为每个类编写相同的代码。至少您应该提取 for-loop 以使这段代码可重用。
  2. 您需要检查_public.hasOwnProperty(method)以使您的代码更健壮。
  3. toStringvalueOf方法需要特殊处理,因为它们在 IE<9 中是不可枚举的。
  4. Snake.prototype = _super.prototype;是一场彻底的灾难。因为你的超类将有孩子的所有方法。

    var F = function(){};
    F.prototype = _super.prototype;
    Snake.prototype = new F();
    Snake.prototype.constructor = Snake;
    
于 2012-11-21T21:31:05.737 回答