OOP In javascript
IM不知道which of using JavaScript是面向对象的方式和最佳的方式去。P></
prototype there is this thing and You have the function风格的方式。但都有很坏的方式inherit基础班。P></
我知道我的方式让this to build很可能没有这样的使用和prototype。P></
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | function Car(name) { this.Name = name; this.FullName = function () { return this.Name; } } function SpecialCar(name, variant) { //BaseClass.apply(this, PARAMS AS ARRAY); Car.apply( this, [name] ); //new property this.Variant = variant; //override function this.FullName = function () { return this.Name +"" + this.Variant ; } } var audi = new Car("audi"); $("#result").append(audi.FullName() +""); var audia3 = new SpecialCar("audi","a3"); $("#result").append(audia3.FullName()+""); |
在这里你可以check the jsfiddle http:/ / / / 2 jsfiddle.net vu9zfP></
这是好的或坏的-是它只是实践?P></
会好的很好的答案,为什么to get some other方式是更好的,因为我只是dont得到它。P></
编辑:谢谢你为我的answering快速!我想在find some of面向对象的JavaScript的方式为自己的在线answering not how to do在JavaScript的面向对象。i dont like the Way of using prototype for that because of using C IM #工时和ITS在我最confusing to between"位交换机C面向对象#样"和"面向对象的prototype"。但有人告诉我,我的意见在the prototype isnt忌好主意,不降,苏。P></
谢谢你的好stackoverflow &;我知道多的时间= saved)P></
就是这样做的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | function Car ( name ) { this.name = name; } Car.prototype.fullName = function () { return this.name; } function SpecialCar ( name, variant ) { Car.apply( this, arguments ); this.variant = variant; } SpecialCar.prototype = Object.create( Car.prototype ); SpecialCar.prototype.fullName = function () { return this.name + ' ' + this.variant; }; |
(IE8需要填充
现场演示:http://jsfiddle.net/3rehr/
因此,应该将这些方法分配给构造函数的原型对象,而不是实例本身。
此外,为了使用超级构造函数预处理实例,只需执行以下操作:
1 | Car.apply( this, arguments ); |
所以不需要
我通常是这样的
它为代码提供了一个更结构化的链接,即使你我喜欢你的代码中能够调用父级构造函数的特性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function Car( name ) { this.Name = name; } Car.prototype.FullName = function FullName() { return this.Name; } function SpecialCar( name, variant ) { this.Name = name; this.Variant = variant; } SpecialCar.prototype = new Car(); SpecialCar.constructor = SpecialCar; SpecialCar.prototype.FullName = function FullName() { return this.Name +"" + this.Variant; } |
这不是特别值得推荐的,因为您实际上返回了一个
1 2 | audia3 instanceof Car === true; audia3 instanceof SpecialCar === false; |
这是令人困惑的,因为您确实执行了
就构造函数模式而言,我实际上更喜欢您的方法,而不是使用
但是,我更喜欢直接使用原型继承,使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var Car = { fullName: function() { return this.name; } } var SpecialCar = Object.create(Car); SpecialCar.fullName = function() { return this.name + ' ' + this.variant; }; var audi = Object.create(Car); audi.name = 'audi'; var audiA3 = Object.create(SpecialCar); audiA3.name = 'audi'; audiA3.variant = 'A3'; |
有些浏览器本机不支持
我就是这样做的。需要一些糖代码才能工作。你可以在Github上找到oojs。OOJS覆盖了大多数来自C++的OOP特性,除了多重继承和强制纯虚拟函数…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | ;( function class_Car( namespace ) { 'use strict'; if( namespace.Car ) return // protect against double inclusions namespace.Car = Car var Static = TidBits.OoJs.setupClass( namespace,"Car" ) // constructor // function Car( name ) { this.Name = name // data member, private by default return this.Public( FullName ) // method FullName will be public } function FullName() { return this.Name; } })( window ) ;( function class_SpecialCar( namespace ) { 'use strict'; if( namespace.SpecialCar ) return // protect against double inclusions namespace.SpecialCar = SpecialCar var Static = TidBits.OoJs.setupClass( namespace,"SpecialCar","Car" ) // constructor // function SpecialCar( name, variant ) { this.Super( name ) this.Variant = variant return this.Public( FullName ) } function FullName() { return this.Car.FullName() +"" + this.Variant } })( window ) var audi = new Car("audi"); $("#result").append(audi.FullName() +""); // output: audi var audia3 = new SpecialCar("audi","a3"); $("#result").append(audia3.FullName()+""); // output: audi a3 |