新方法Object.hasOwn()返回一个布尔值,指示指定对象是否将指定属性作为其自己的属性,但也有Object.prototype.hasOwnProperty(),它们之间有什么区别,使用其中一个相对于另一个有什么好处?
javascript prototypal-inheritance javascript-objects hasownproperty
赏金编辑:
我正在寻找用纯粹的原型OO范例编写的代码(想想Self).不是原型OO和经典OO的混合物.我不想看到通用的OO包装器,而只是使用原型OO技术和仅原型OO技术.
参考相关问题:
在上面的问题中我主要关注
可以写这样的原型OO吗?
我们需要构造函数和初始化逻辑吗?有哪些替代方案?
新问题:
基本上在大型开源项目中有没有javascript原型 OO的好例子?
澄清:
我将不得不澄清我对原型OO的意思:
进一步澄清原型OO:
JavaScript中的原型OO与经典的OO仿真之间的区别是一个非常灰色的区域.这不是我重视避免经典的OO.我想以学术的方式学习原型OO本身,而不学习经典OO仿真和原型OO的(可能更优化)组合.
这就是为什么我"禁止"课程,只是为了让我能够以纯粹的方式看到这些技术并扩展我自己的OO工具包.
例子:
像jQuery这样的热门例子无法满足第二个标准.该jQuery对象是一个大类仿真.它侧重于从类创建新对象,而不是克隆现有对象.
如果我真的知道使用"纯"原型OO的任何例子,我会告诉你.我相信99%的JavaScript OO受到经典仿真的太大影响.
奖励积分
如果
我还将接受有关如何编写超出您的琐碎hello world应用程序的原型OO代码的文章/教程和示例.
javascript oop prototypal-inheritance ecmascript-5 prototypal
只有3行代码,但我很难完全掌握这个:
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
newObject = Object.create(oldObject);
Run Code Online (Sandbox Code Playgroud)
Object.create()通过创建一个名为的空函数开始F.我认为函数是一种对象.这个F对象存放在哪里?在全球范围内我猜.
接下来,我们oldObject传入o,成为功能的原型F.函数(即对象)F现在从我们"继承" oldObject,在名称解析将通过它的路上.很好,但我很好奇默认原型是什么对象,对象?这对于函数对象也是如此吗?
最后,F实例化并返回,成为我们的newObject.new这里的操作是否必要?还没有F提供我们需要的东西,或者功能对象和非功能对象之间是否存在重要区别?显然,使用这种技术不可能有一个构造函数.
下次Object.create()调用会发生什么?全局功能F被覆盖了吗?当然它不会被重用,因为这会改变以前配置的对象.如果多个线程调用会发生什么Object.create(),是否有任何类型的同步来防止竞争条件F?
我正在寻找一种简单的方法来创建两个类,一个继承自另一个类,子类重新定义父方法之一,并在新方法内调用父类.
例如,有一个类,Animal并且Dog,Animal类定义了一个makeSound()确定如何输出声音的方法,然后Dog在其自己的makeSound()方法中覆盖以产生"低音"声音,但同时也调用Animal makeSound()来输出那个低音.
我在这里查看了John Resig的模型,但它使用了arguments.calleeECMA脚本中明显折旧的本机属性.这是否意味着我不应该使用John Resig的代码?
使用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()的行
请帮我理解一下.
我正在用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)
它似乎工作.不确定它是否是最好的解决方案,因为我正在为每个请求创建一个新的响应包装器对象,这是一个问题吗?
在extjs中,你总是可以通过扩展extjs类constructor().对于从Component你那里学习的课程也可以延伸initComponent().
我想知道为什么这么多代码扩展通过initComponent,而constructor似乎是通用扩展方法.是否initComponent提供明显的优势了constructor?
我正在尝试理解创建和使用对象的"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中有更多的经验,后一种方法对我来说感觉更舒服(也许这是足够的理由).但我觉得原型继承的精神更像是第一选择.
哪种方法更多的是原型编程的"精神"?还是我完全忽略了这一点?
给定简单的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) 虽然我知道你不能像在C#中那样执行继承,但我已经看到它在互联网上提到它有可能.如果使用普通的JavaScript代码是不可能的话那么可以使用Ext JS吗?如果可以的话怎么样?
javascript ×10
oop ×4
inheritance ×3
extjs ×2
connect ×1
creation ×1
ecmascript-5 ×1
express ×1
node.js ×1
object ×1
prototypal ×1
prototype ×1