4

我想了解这个原型。

你们中的任何人都可以澄清一下使用的原型有什么区别吗?

https://developer.mozilla.org/en/Introduction_to_Object-Oriented_JavaScript链接和 http://www.prototypejs.org/learn/class-inheritance

提前致谢。

4

3 回答 3

2

没有区别。Prototype JS 只是一个让使用 JavaScript 变得更容易的框架。两种情况下的prototype属性都属于用作构造函数的函数,即简单的 JavaScript。

如果您想进一步了解 JavaScript 中的继承,请阅读以下答案。我个人不喜欢使用任何框架。我使用的唯一框架是Vapor.js。但是,在使用类时,我通常会使用以下要点

var Class = function () {
    var slice = Array.prototype.slice;
    var bind = Function.prototype.bind;

    var prototype = Class.prototype = new Function;
    return prototype.constructor = Class;

    function Class(definition, base) {
        var klass = function () {
            var instance = this;

            if (base instanceof Class)

            var uber = function () {
                if (uber instanceof base) return uber;

                arguments = slice.call(arguments);
                arguments = [null].concat(arguments);
                uber = bind.apply(base, arguments);
                uber = new uber;

                var hyper = instance.__proto__ = uber;
                var proto = hyper.__proto__;

                while (proto != parent) {
                    hyper = proto;
                    proto = hyper.__proto__;
                }

                hyper.__proto__ = child;

                return uber;
            };

            var constructor = definition.call(this, uber);
            constructor.apply(this, arguments);
        };

        if (base instanceof Class) {
            klass.__proto__ = base;
            var child = klass.prototype;
            var parent = child.__proto__ = base.prototype;
        } else klass.__proto__ = prototype;

        return klass;
    }
}();

这使我可以按如下方式创建类:

var Rectangle = new Class(function () {
    var width;
    var height;

    function constructor(length, breadth) {
        width = length;
        height = breadth;
    }

    this.area = function () {
        return width * height;
    };

    return constructor;
});

继承很简单:

var Square = new Class(function (uber) {
    return function (side) {
        uber(side, side);
    };
}, Rectangle);

您还可以使用基类方法,例如:

var Cube = new Class(function (uber) {
    var side;

    function constructor() {
        side = arguments[0];
        uber = uber(side);
    }

    this.area = function () {
        return 6 * uber.area();
    };

    this.volume = function () {
        return side * uber.area();
    };

    return constructor;
}, Square);

每个类都有自己的原型对象。因此,原型或类本身的任何属性(静态属性)都会被每个派生类自动继承。uber在调用函数之前,不会继承类中定义的属性。该uber函数返回基类的一个实例,以便可以调用基类方法。

编辑:这是上述模式的一个工作示例:

var cube = new Cube(5);
alert("Side of the cube: 5");
alert("Area of the cube: " + cube.area());     // 150
alert("Volume of the cube: " + cube.volume()); // 125
于 2012-07-24T04:17:45.697 回答
1

第二个链接是描述Prototype,一个用于构建 JavaScript 应用程序的框架;这是一个专有名称。(有点像将窗口系统命名为“Windows”,随便举个例子。)第一个链接中使用的“原型”一词是 JavaScript 内部工作方式的标准术语。该框架以原型概念命名。

在此链接中对 JavaScript 中的“原型”概念进行了很好的介绍。

于 2012-07-24T04:04:43.677 回答
0

https://developer.mozilla.org/en/Introduction_to_Object-Oriented_JavaScript中提到的原型是一种编程风格(面向对象的编程不使用class);然而

http://www.prototypejs.org中提到的 Prototype是一个 JavaScript 库或框架,类似于 jQuery、MooTools 等。

于 2012-07-24T04:05:06.527 回答