我最近才开始编程,并且完全是自学成才,遗憾的是,我没有详细的计算机科学课程的好处。我最近一直在阅读很多关于JavaScript的内容,并且我试图在类中找到JavaScript的原型性质。这个问题似乎是在一个更好的中间绘制出来的,我希望看到它的经典方面。
当我查看原型示例时:
var inst_a = {
"X": 123,
"Y": 321,
add: function () {
return this.X+this.Y;
}
};
document.write(inst_a.add());
然后是经典版
function A(x,y){
this.X = x;
this.Y = y;
this.add = function(){
return this.X+this.Y;
};
};
var inst_a = new A(123,321);
document.write(inst_a.add());
我开始考虑这个因为我正在查看新的ecmascript修订版5并且很多人似乎并没有添加类系统。
答案 0 :(得分:3)
当您通过new
创建对象时,它将使用它的原型链来查找实例中找不到的属性。
因此,例如,您可以将add
方法添加到A.prototype
一次,而不是每次创建A
的新实例时重新定义相同函数的新副本
function A(x,y){
this.X = x;
this.Y = y;
};
//define add once, instead of every time we create a new 'A'
A.prototype.add = function(){
return this.X+this.Y;
};
答案 1 :(得分:3)
如果不使用psuedoclassical样式,实际上不可能继承。看看道格拉斯·克罗克福德对say有什么看法。即使您要使用纯粹的原型对象结构,您也必须创建一个构造函数来继承(Crockford会这样做,然后在create
方法后面抽象它然后将其称为纯粹的原型)
答案 2 :(得分:2)
使用第二种方法,您可以创建A
的实例,允许您一次拥有多个实例。例如:
var inst_one = new A(123,321);
var inst_two = new A(456,654);
// some meaningful code here...
document.write(inst_one.add());
// some more meaningful code here...
document.write(inst_two.add());
您提供的示例很简单,所以让我们构建一个更直观的例子:
function Comment(user,text){
this.user = user;
this.text = text;
this.toString = function(){
return '<span class="comment">'+this.text+' - <a class="user">'+this.user+'</a></span>';
};
};
var comments = someFunctionThatReturnsALotOfCommentObjects();
for(c=0;c<comments.length;c++)
document.getElementById('comments_container').innerHTML += comments[c].toString();
这(希望)证明了能够创建类的多个实例的好处。这不是一个基本的JavaScript概念,它是一个基本的Object Oriented Programming概念,如果您没有正式的编程课程,这可能就是您不熟悉它的原因。
答案 3 :(得分:1)
公平地说,JavaScript 有类。好吧,也许有些人会争辩,但我认为这只是头发的语义分裂。如果一个类被认为是用于创建对象的蓝图,那么JavaScript函数可以以该容量服务。这里的函数没有很多的区别,只有形式:
class someObj
{
private int x;
public int returnX()
{
return x;
}
}
someObj temp = new someObj();
-
function someObj {
var x;
this.returnX = function() {
return x;
};
}
var temp = new someObj();
在引擎盖下它们是不同的,但你可以使用任何一种形式来服务于同一目的。
原型在继承方面确实不同。在创建新对象时,在原型继承中,您实际上是在复制原型对象的实例,然后向其中添加新的字段或成员。另一方面,经典继承不是处理实例而只是处理“蓝图”。例如,在JavaScript中你会说:
temp.prototype = new someOtherObj(); //Creating a new instance to serve as the prototype.
用经典语言你可能会说:
class someObj : someOtherObj //Copying the "blue print" over.
暗示数据将在原型语言中的派生对象之间共享。我曾经编写过一个函数,并通过JavaScript中的原型设计从中获得了另一个函数。这个基础对象持有对DOM对象的引用,当我在一个子对象中更改它时,它将为该子对象的所有实例更改它。这是因为,在原型语言中,您是从实例派生而不是“蓝图”。
答案 4 :(得分:0)
经典版本允许您声明作用于对象“内部”的私有变量,而原型版本则不然。