OOP在javascript中

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需要填充Object.create

现场演示:http://jsfiddle.net/3rehr/

因此,应该将这些方法分配给构造函数的原型对象,而不是实例本身。

此外,为了使用超级构造函数预处理实例,只需执行以下操作:

1
Car.apply( this, arguments );

所以不需要this.base的东西。


我通常是这样的

它为代码提供了一个更结构化的链接,即使你我喜欢你的代码中能够调用父级构造函数的特性。

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;
}


这不是特别值得推荐的,因为您实际上返回了一个Car实例,而不是一个SpecialCar实例。

1
2
audia3 instanceof Car === true;
audia3 instanceof SpecialCar === false;

这是令人困惑的,因为您确实执行了new SpecialCar。另外,SpecialCar.prototype的属性在实例上也不可用,但您似乎正在使用自定义继承复制模式。


就构造函数模式而言,我实际上更喜欢您的方法,而不是使用apply或任何类似的方法。由于return的必要性,它可能会有点混乱,但我觉得它不像apply那么脏。

但是,我更喜欢直接使用原型继承,使用Object.create

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';

有些浏览器本机不支持Object.create,但它是可调的。


我就是这样做的。需要一些糖代码才能工作。你可以在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