关于原型和prototypejs

时间:2012-07-24 03:57:16

标签: javascript object prototypejs

我想了解这个原型。

你们任何人都可以澄清

中使用的原型之间的区别

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

提前感谢。

3 个答案:

答案 0 :(得分:2)

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

如果您想了解有关JavaScript继承的更多信息,请阅读以下answer。我个人不喜欢使用任何框架。我使用的唯一框架是Vapor.js。但是,在使用类时,我通常会使用以下gist

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函数返回基类的实例,以便可以调用基类方法。

修改:以上是上述模式的working example

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

答案 1 :(得分:1)

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

this link在JavaScript中对“原型”的概念进行了很好的介绍。

答案 2 :(得分:0)

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

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