gpt4 book ai didi

javascript - John Resig 的 Javascript 继承片段是否已弃用?

转载 作者:行者123 更新时间:2023-12-03 02:04:54 25 4
gpt4 key购买 nike

我正在寻找一种简单的方法来创建两个类,一个类继承另一个类,子类重新定义父类的方法之一,并在新方法中调用父类的方法。

例如,有一个类 AnimalDog,其中 Animal 类定义了一个方法 makeSound(),该方法确定如何输出然后,Dog 在自己的 makeSound() 方法中重写该方法以发出“woof”声音,同时还调用 Animal 的 makeSound() 来输出该 woof。

我查看了 John Resig 的模型 here ,但它使用了 native arguments.callee 属性,该属性在 ECMA 脚本 5 中显然已被贬值。这是否意味着我不应该使用 John Resig 的代码?

使用 Javascript 的原型(prototype)继承模型编写动物/狗代码的一种简洁、简洁的方法是什么?

最佳答案

Does that mean I shouldn't use John Resig's code?

正确,当您在严格模式下使用 ES5 时则不然。但是,它可以很容易地进行调整:

/* Simple JavaScript Inheritance for ES 5.1
* based on http://ejohn.org/blog/simple-javascript-inheritance/
* (inspired by base2 and Prototype)
* MIT Licensed.
*/
(function(global) {
"use strict";
var fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;

// The base Class implementation (does nothing)
function BaseClass(){}

// Create a new Class that inherits from this class
BaseClass.extend = function(props) {
var _super = this.prototype;

// Set up the prototype to inherit from the base class
// (but without running the init constructor)
var proto = Object.create(_super);

// Copy the properties over onto the new prototype
for (var name in props) {
// Check if we're overwriting an existing function
proto[name] = typeof props[name] === "function" &&
typeof _super[name] == "function" && fnTest.test(props[name])
? (function(name, fn){
return function() {
var tmp = this._super;

// Add a new ._super() method that is the same method
// but on the super-class
this._super = _super[name];

// The method only need to be bound temporarily, so we
// remove it when we're done executing
var ret = fn.apply(this, arguments);
this._super = tmp;

return ret;
};
})(name, props[name])
: props[name];
}

// The new constructor
var newClass = typeof proto.init === "function"
? proto.hasOwnProperty("init")
? proto.init // All construction is actually done in the init method
: function SubClass(){ _super.init.apply(this, arguments); }
: function EmptyClass(){};

// Populate our constructed prototype object
newClass.prototype = proto;

// Enforce the constructor to be what we expect
proto.constructor = newClass;

// And make this class extendable
newClass.extend = BaseClass.extend;

return newClass;
};

// export
global.Class = BaseClass;
})(this);

关于javascript - John Resig 的 Javascript 继承片段是否已弃用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15050816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com