标签: prototypal-inheritance

Object.hasOwn() 与 Object.prototype.hasOwnProperty()

新方法Object.hasOwn()返回一个布尔值,指示指定对象是否将指定属性作为其自己的属性,但也有Object.prototype.hasOwnProperty(),它们之间有什么区别,使用其中一个相对于另一个有什么好处?

javascript prototypal-inheritance javascript-objects hasownproperty

29
推荐指数
1
解决办法
2万
查看次数

(开源)JavaScript Prototypical OO的例子

赏金编辑:

我正在寻找用纯粹的原型OO范例编写的代码(想想Self).不是原型OO和经典OO的混合物.我不想看到通用的OO包装器,而只是使用原型OO技术和原型OO技术.

参考相关问题:

JavaScript中的原型OO

在上面的问题中我主要关注

可以写这样的原型OO吗?

我们需要构造函数和初始化逻辑吗?有哪些替代方案?

新问题:

基本上在大型开源项目中有没有javascript原型 OO的好例子

澄清:

我将不得不澄清我对原型OO的意思:

  • 没有课程.只有对象.
  • 仿真类的概念,又只有对象和克隆对象来创建新的对象.

进一步澄清原型OO:

JavaScript中的原型OO与经典的OO仿真之间的区别是一个非常灰色的区域.这不是我重视避免经典的OO.我想以学术的方式学习原型OO本身,而不学习经典OO仿真和原型OO的(可能更优化)组合.

这就是为什么我"禁止"课程,只是为了让我能够以纯粹的方式看到这些技术并扩展我自己的OO工具包.

例子:

像jQuery这样的热门例子无法满足第二个标准.该jQuery对象是一个大类仿真.它侧重于从类创建新对象,而不是克隆现有对象.

如果我真的知道使用"纯"原型OO的任何例子,我会告诉你.我相信99%的JavaScript OO受到经典仿真的太大影响.

奖励积分

如果

  • 它的编写/记录很好
  • 有单元测试
  • 在github上.

我还将接受有关如何编写超出您的琐碎hello world应用程序的原型OO代码的文章/教程和示例.

javascript oop prototypal-inheritance ecmascript-5 prototypal

28
推荐指数
1
解决办法
1505
查看次数

Crockford的对象创建技术发生了什么?

只有3行代码,但我很难完全掌握这个:

Object.create = function (o) {
    function F() {}
    F.prototype = o;
    return new F();
};
newObject = Object.create(oldObject);
Run Code Online (Sandbox Code Playgroud)

(来自Prototypal Inheritance)

  1. Object.create()通过创建一个名为的空函数开始F.我认为函数是一种对象.这个F对象存放在哪里?在全球范围内我猜.

  2. 接下来,我们oldObject传入o,成为功能的原型F.函数(即对象)F现在从我们"继承" oldObject,在名称解析将通过它的路上.很好,但我很好奇默认原型是什么对象,对象?这对于函数对象也是如此吗?

  3. 最后,F实例化并返回,成为我们的newObject.new这里的操作是否必要?还没有F提供我们需要的东西,或者功能对象和非功能对象之间是否存在重要区别?显然,使用这种技术不可能有一个构造函数.

下次Object.create()调用会发生什么?全局功能F被覆盖了吗?当然它不会被重用,因为这会改变以前配置的对象.如果多个线程调用会发生什么Object.create(),是否有任何类型的同步来防止竞争条件F

javascript creation object prototypal-inheritance

25
推荐指数
2
解决办法
6096
查看次数

John Resig的Javascript继承代码段是否已被弃用?

我正在寻找一种简单的方法来创建两个类,一个继承自另一个类,子类重新定义父方法之一,并在新方法内调用父类.

例如,有一个类,Animal并且Dog,Animal类定义了一个makeSound()确定如何输出声音的方法,然后Dog在其自己的makeSound()方法中覆盖以产生"低音"声音,但同时也调用Animal makeSound()来输出那个低音.

我在这里查看了John Resig的模型,但它使用了arguments.calleeECMA脚本中明显折旧的本机属性.这是否意味着我不应该使用John Resig的代码?

使用Javascript的原型继承模型编写动物/狗代码的简洁方法是什么?

javascript oop inheritance prototypal-inheritance

24
推荐指数
2
解决办法
6446
查看次数

Javascript函数对象的属性

我有一个JavaScript函数对象;

var addNum = function(num1, num2) {
        return num1 + num2;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试访问

addNum.divide()
Run Code Online (Sandbox Code Playgroud)

我想了解上述代码的原型链.我读到在上面的例子中,addNum将被搜索divide(),然后是Function.prototype,最后是Object.prototype.

但我的问题是在上面的例子中,addNum如何搜索divide()

它是指类似的东西吗?

var addNum = function(num1, num2) {

this.divide = function(){}

            return num1 + num2;
    }
Run Code Online (Sandbox Code Playgroud)

我无法理解addNum将被搜索为divide()的行

请帮我理解一下.

javascript oop prototype prototypal-inheritance

24
推荐指数
2
解决办法
3万
查看次数

Node.js/Express.js - 如何覆盖/拦截res.render函数?

我正在用Connect/Express.js构建一个Node.js应用程序,我想拦截res.render(视图,选项)函数来运行一些代码,然后再转发到原始的渲染函数.

app.get('/someUrl', function(req, res) {

    res.render = function(view, options, callback) {
        view = 'testViews/' + view;
        res.prototype.render(view, options, callback);
    };

    res.render('index', { title: 'Hello world' });
});
Run Code Online (Sandbox Code Playgroud)

它看起来像一个人为的例子,但它确实适合我正在构建的整体框架.

我对JavaScript的OOP和Prototypal继承的了解有点弱.我该怎么办?


更新:经过一些实验,我想出了以下内容:

app.get('/someUrl', function(req, res) {

    var response = {};

    response.prototype = res;

    response.render = function(view, opts, fn, parent, sub){
        view = 'testViews/' + view;
        this.prototype.render(view, opts, fn, parent, sub);
    };

    response.render('index', { title: 'Hello world' });
});
Run Code Online (Sandbox Code Playgroud)

它似乎工作.不确定它是否是最好的解决方案,因为我正在为每个请求创建一个新的响应包装器对象,这是一个问题吗?

javascript connect prototypal-inheritance node.js express

23
推荐指数
3
解决办法
2万
查看次数

Extjs:通过构造函数或initComponent扩展类?

在extjs中,你总是可以通过扩展extjs类constructor().对于从Component你那里学习的课程也可以延伸initComponent().

我想知道为什么这么多代码扩展通过initComponent,而constructor似乎是通用扩展方法.是否initComponent提供明显的优势了constructor

javascript inheritance extjs prototypal-inheritance

22
推荐指数
2
解决办法
2万
查看次数

原型编程中对象和原型有什么区别?

我正在尝试理解创建和使用对象的"JavaScript方式",我认为我遇到了对对象和原型的误解.

在我刚开始的一个新项目中,我决定尝试原型继承.我很困惑,如果这意味着我应该创建一个我打算使用的对象,然后使用如下方法创建其他对象Object.create():

var labrador = {
   color: 'golden',
   sheds: true,

   fetch: function()
   {
      // magic
   }
};

var jindo = Object.create(dog);
jindo.color = 'white';
Run Code Online (Sandbox Code Playgroud)

或者,如果我应该创建一种类,并创建使用它的实例Object.create().

var Dog = { // Is this class-like thing a prototype?
   color: null,
   sheds: null,

   fetch: function()
   {
      // magic
   }
};

var labrador = Object.create(Dog);
labrador.color = 'golden';
labrador.sheds = true;

var jindo = Object.create(Dog);
jindo.color = 'white';
jindo.sheds = true;
Run Code Online (Sandbox Code Playgroud)

在基于类的OOP中有更多的经验,后一种方法对我来说感觉更舒服(也许这是足够的理由).但我觉得原型继承的精神更像是第一选择.

哪种方法更多的是原型编程的"精神"?还是我完全忽略了这一点?

javascript oop prototypal-inheritance prototype-programming

21
推荐指数
1
解决办法
3533
查看次数

this.function和prototype.function有什么区别?

给定简单的JS继承,这两个例子之间的基函数的实际差异是什么?换句话说,什么时候应该选择在"this"上而不是在原型上(或者相反的方式)定义一个函数?

对我来说,第二个例子更容易消化,但还有多少呢?

在此定义的函数:

//base
var _base = function () {
    this.baseFunction = function () {
        console.log("Hello from base function");
    }
};
//inherit from base
function _ctor() {
    this.property1 = "my property value";
};
_ctor.prototype = new _base();
_ctor.prototype.constructor = _ctor;
//get an instance
var instance = new _ctor();
console.log(instance.baseFunction);
Run Code Online (Sandbox Code Playgroud)

原型上定义的函数:

//base
var _base = function () {};
_base.prototype.baseFunction = function () {
    console.log("Hello from base function");
}
//inherit from base
function _ctor() {
    this.property1 = "my property value";
};
_ctor.prototype …
Run Code Online (Sandbox Code Playgroud)

javascript prototypal-inheritance

20
推荐指数
1
解决办法
5830
查看次数

在JavaScript中执行继承

虽然我知道你不能像在C#中那样执行继承,但我已经看到它在互联网上提到它有可能.如果使用普通的JavaScript代码是不可能的话那么可以使用Ext JS吗?如果可以的话怎么样?

javascript inheritance extjs prototypal-inheritance

19
推荐指数
1
解决办法
1万
查看次数