我不是那种动态编程语言,但是我写了很多JavaScript代码.我从来没有真正了解这个基于原型的编程,有没有人知道这是如何工作的?
var obj = new Object();
obj.prototype.test = function() { alert('Hello?'); };
var obj2 = new obj();
obj2.test();
Run Code Online (Sandbox Code Playgroud)
我记得很久以前我和人们进行了很多讨论(我不确定我在做什么)但是据我所知,没有一个类的概念.它只是一个对象,这些对象的实例是原始的克隆,对吧?
但是JavaScript中这个".prototype"属性的确切目的是什么?它与实例化对象有什么关系?
var obj = new Object(); // not a functional object
obj.prototype.test = function() { alert('Hello?'); }; // this is wrong!
function MyObject() {} // a first class functional object
MyObject.prototype.test = function() { alert('OK'); } // OK
Run Code Online (Sandbox Code Playgroud)
这些幻灯片也非常有帮助.
我想知道使用这些中的任何一个是否有任何优势,我应该走哪条路?
构造方法:
var Class = function () {
this.calc = function (a, b) {
return a + b;
};
};
Run Code Online (Sandbox Code Playgroud)
原型方法:
var Class = function () {};
Class.prototype.calc = function (a, b) {
return a + b;
};
Run Code Online (Sandbox Code Playgroud)
我不喜欢这样,使用原型,方法定义与类分开,我不知道是否有任何特定的原因我应该使用它而不是第一种方法.
此外,使用函数文字定义"类"是否有任何好处,而不仅仅是函数定义:
var Class = function () {};
Run Code Online (Sandbox Code Playgroud)
VS
function Class () {};
Run Code Online (Sandbox Code Playgroud)
谢谢!
我目前正在从Java转换为Javascript,我有点难以弄清楚如何按照我希望的方式扩展对象.
我见过互联网上有几个人使用一种名为extend on object的方法.代码如下所示:
var Person = {
name : 'Blank',
age : 22
}
var Robot = Person.extend({
name : 'Robo',
age : 4
)}
var robot = new Robot();
alert(robot.name); //Should return 'Robo'
Run Code Online (Sandbox Code Playgroud)
有谁知道如何使这项工作?我听说你需要写
Object.prototype.extend = function(...);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使这个系统工作.如果不可能,请告诉我另一个扩展对象的替代方案.
在PHP/Java中可以做到:
class Sub extends Base
{
}
Run Code Online (Sandbox Code Playgroud)
并且Super类的所有公共/受保护方法,属性,字段等自动成为Sub类的一部分,必要时可以覆盖它.
Javascript中的等价物是什么?
我在很多Node.js库中看到了这种模式:
Master.prototype.__proto__ = EventEmitter.prototype;
Run Code Online (Sandbox Code Playgroud)
(来源这里)
有人可以用一个例子向我解释,为什么这是一个如此常见的模式,什么时候它很方便?
我已经阅读了一些我可以在互联网上找到的关于多态性的文章.但我认为我无法理解它的含义及其重要性.大多数文章没有说明为什么它很重要以及如何在OOP中实现多态行为(当然在JavaScript中).
我无法提供任何代码示例,因为我还没有想到如何实现它,所以我的问题如下:
我有这个例子.但是很容易理解这段代码会产生什么结果.它没有给出关于多态性本身的任何清晰的想法.
function Person(age, weight) {
this.age = age;
this.weight = weight;
this.getInfo = function() {
return "I am " + this.age + " years old " +
"and weighs " + this.weight +" kilo.";
}
}
function Employee(age, weight, salary) {
this.salary = salary;
this.age = age;
this.weight = weight;
this.getInfo = function() {
return "I am " + this.age + " years old " +
"and weighs " + this.weight +" …Run Code Online (Sandbox Code Playgroud) javascript oop polymorphism functional-programming parametric-polymorphism
我读过它而不是简单地编写一堆函数,我应该使用object literal.
有人可以用例子来解释对象文字的优点,因为到目前为止我还不明白.
谢谢
我正在寻找一种简单的方法来创建两个类,一个继承自另一个类,子类重新定义父方法之一,并在新方法内调用父类.
例如,有一个类,Animal并且Dog,Animal类定义了一个makeSound()确定如何输出声音的方法,然后Dog在其自己的makeSound()方法中覆盖以产生"低音"声音,但同时也调用Animal makeSound()来输出那个低音.
我在这里查看了John Resig的模型,但它使用了arguments.calleeECMA脚本中明显折旧的本机属性.这是否意味着我不应该使用John Resig的代码?
使用Javascript的原型继承模型编写动物/狗代码的简洁方法是什么?
之前有人注意到这种行为吗?这真的让我失望......我原本希望原型数组对每个类实例都是私有的,而不是在所有类实例之间共享.
有人可以验证这是正确的行为,并可能更详细地解释这种行为?
请注意注释的代码以及它如何影响脚本的行为.
<html>
<head>
<script type="text/javascript">
function print_r( title, object ) {
var output = '';
for( var key in object ) {
output += key + ": " + object[ key ] + "\n";
}
output = title + "\n\n" + output;
alert( output );
}
function Sandwich() {
// Uncomment this to fix the problem
//this.ingredients = [];
}
Sandwich.prototype = {
"ingredients" : [],
"addIngredients" : function( ingArray ) {
for( var key in ingArray ) …Run Code Online (Sandbox Code Playgroud) 我一直看到Class.prototype.method的例子,但从来没有看过this.prototype.method的例子.例如:
function Class() {
this.prototype.method = function() {
alert("is this allowed?");
};
}
Run Code Online (Sandbox Code Playgroud)
VS
function Class() {}
Class.prototype.method = function() {
alert("traditional example");
};
Run Code Online (Sandbox Code Playgroud)
javascript ×9
oop ×5
prototype ×4
arrays ×1
class ×1
eventemitter ×1
extends ×1
function ×1
inheritance ×1
node.js ×1
object ×1
polymorphism ×1