Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 原型未按预期工作_Javascript_Jquery_Asp.net_Prototype - Fatal编程技术网

Javascript 原型未按预期工作

Javascript 原型未按预期工作,javascript,jquery,asp.net,prototype,Javascript,Jquery,Asp.net,Prototype,我使用下面的代码来学习JS原型以及如何使用对象(在我在网上读到它之后,我是JS新手…),我想创建一个其他类可以使用和扩展的根对象 不确定我是否做得对…目前我在声音方面有错误(无法设置未定义的属性'sound',知道我做错了什么,或者可能有更好的方法来写它,(对我来说,这是第三稿…:) 发生这种情况是因为声音未定义-属性不存在 创建具有声音属性的对象的简单方法如下(使用jquery): 您的示例不起作用的原因是您实例化了一个新的obj实例,它没有声音属性。因此,您需要一种机制来扩展已实例化的对象。

我使用下面的代码来学习JS原型以及如何使用对象(在我在网上读到它之后,我是JS新手…),我想创建一个其他类可以使用和扩展的根对象 不确定我是否做得对…目前我在声音方面有错误(无法设置未定义的属性'sound',知道我做错了什么,或者可能有更好的方法来写它,(对我来说,这是第三稿…:)


发生这种情况是因为声音未定义-属性不存在

创建具有声音属性的对象的简单方法如下(使用jquery):

您的示例不起作用的原因是您实例化了一个新的obj实例,它没有声音属性。因此,您需要一种机制来扩展已实例化的对象。因此,在我的示例中,我向您展示了一种快速简便的方法返回一个对象而不是函数,因此当您调用

var animal = new obj();
animal
变量将填充非函数对象。此声明

var dog = new animal();
返回未定义的
,因为动物不是函数(构造函数)。请注意,运算符
new
仅用于函数,而不用于文本对象

有关此主题的更多信息,请查看


一个简单的JavaScript继承模式 首先定义一个基类(JS中没有类概念,但我使用它是为了更方便)

接下来,您可以定义一个扩展
obj
类的
animal

function Animal(name, legs){ 
    // This is its own property
    this.legs = legs;
    // This is accessible via prototype chain
    this.setName(name);
}

// link this class to the obj class
Animal.prototype = new Obj();
此模式的可视化模式为:

    Animal
  +------------+  
  | legs       |           Obj
  | __proto__  | -----> +-----------+  
  +------------+        | name      |         prototype object for Obj
                        | __proto__ | -------> +--------------------+  
                        +-----------+          | setName function   |  
                                               +--------------------+
更新#1 例如,要声明另一个类,
Person
,您可能需要执行以下操作:

function Person(name, addr, phoneNo){
    this.name = name;  // This is inherited from the Obj class
    this.addr = addr;  // Its own property
    this.phoneNo = phoneNo; // Its own propert
    this.legs = 2; // This is from Animal 
}

Person.prototype = new Animal();

你在试图继承遗产

你必须这样做

var animal = function () {}
animal.prototype = new obj();
animal.prototype.constructor=animal;
src:

另一方面,您可能想知道您可以使用:

obj.prototype.__defineGetter__("name", function () { return this.n; /* where n is the name */ });
像那样使用它

var a = new obj("foo");
console.log(a.name);

我在上一个语句中遇到了无法设置未定义属性“sound”的错误…即使有更好的方法,我很想知道为什么这种方法不起作用。@DeeMac-不确定我对这个主题是不是很陌生,所以我现在运行这个文件时遇到了错误…Ok更新了我的答案-这与对象继承有关。我不相信这是
var dog=new animal()这给他带来了问题@abforce-那么我应该如何更好地收缩它?@Billgoldberg您是否在寻找一种在JS中模拟继承的方法?感谢投票通过,最后一个问题是,现在应该将其扩展到具有例如姓氏腿、工作地点、地址等的人身上。@downvoter为什么选择downvote?如果有什么问题,请告诉我谢谢,但不确定如何使用此代码var animal=function(){}是什么?它只是创建类animal
var animal = function () {}
animal.prototype = new obj();
animal.prototype.constructor=animal;
obj.prototype.__defineGetter__("name", function () { return this.n; /* where n is the name */ });
var a = new obj("foo");
console.log(a.name);