相关疑难解决方法(0)

如何在JavaScript中"正确"创建自定义对象?

我想知道创建一个具有属性和方法的JavaScript对象的最佳方法是什么.

我已经看到了这个人在所有函数中使用var self = this然后使用的示例,self.以确保范围始终正确.

然后我看到了使用.prototype添加属性的示例,而其他人则使用内联方式.

有人可以给我一个具有一些属性和方法的JavaScript对象的正确示例吗?

javascript

464
推荐指数
7
解决办法
13万
查看次数

我如何继承javascript函数?

// Don't break the function prototype.
// pd - https://github.com/Raynos/pd
var proto = Object.create(Function.prototype, pd({
  "prop": 42
}));

var f = function() { return "is a function"; };
f.__proto__ = proto;

console.log(f.hasOwnProperty("prop")); // false
console.log(f.prop); // 42
console.log(f()); // "is a function"
Run Code Online (Sandbox Code Playgroud)

.__proto__ 是非标准的并且已弃用.

我怎么应该继承原型创建一个对象,但让该对象成为一个函数.

Object.create 返回Object而不是Function.

new Constructor 返回Object而不是Function.

动机: - 跨浏览器finherit

var finherit = function (parent, child) {
    var f = function() { 
        parent.apply(this, arguments);
        child.apply(this, arguments);
    };
    f.__proto__ = parent;
    Object.keys(child).forEach(function _copy(key) {
        f[key] = child[key]; …
Run Code Online (Sandbox Code Playgroud)

javascript oop inheritance function prototypal-inheritance

47
推荐指数
1
解决办法
5933
查看次数

有没有有效的方法在javascript中使用`__proto__`或`setPrototypeOf()`?

MDN对于修改代码中的原型有一个巨大的可怕警告:

根据[[Prototype]]现代JavaScript引擎如何在每个浏览器和JavaScript引擎中优化属性访问,非常慢的操作,改变对象的性质.对改变继承的性能的影响是微妙和遥远的,并不仅仅局限于在Object.setPrototypeOf(...)语句中花费的时间,而是可以扩展到任何可以访问任何[[Prototype]]已被更改的对象的代码 .如果您关心性能,则应避免设置[[Prototype]]对象.而是[[Prototype]]使用所需的使用创建一个新对象Object.create().

- MDN> JavaScript> Object.setPrototypeOf()

我想知道是否有任何情况你可以修改对象的原型而不会导致级联的优化效果,从而破坏程序的性能.好像应该有.例如,如果您只是在创建对象之后(以及在其他任何东西使用之前)修改原型.但我想这是依赖引擎的.

那么有谁知道是否有有效的方法来修改对象的原型?

编辑:这个问题的动机来自于创建实际继承的对象的愿望Function.我知道如何做到这一点的唯一方法是修改函数的原型.请参阅Raynos答案的最底部:javascript类继承自Function类

javascript inheritance prototype prototypal-inheritance prototype-chain

10
推荐指数
1
解决办法
387
查看次数

如何使JavaScript函数继承正常工作

我有一个问题.我正在研究一个相当大的JavaScript项目,我正在学习如何使用OOP.JS中有点奇怪,我相信你知道.

所以这就是我要做的事情:我有一个基础'课',我打电话AbstractAnimal.我有另一个叫做的课Animals.里面的Animals类我有三个组,即Man,MonkeyElephant.我希望每个组都继承AbstractAnimal,但要成为自己的功能,而不是连接到AbstractAnimal.

我最初是这样做的:

Animals.prototype.Man = AbstractAnimal;
Animals.prototype.Monkey = AbstractAnimal; //etc...
Run Code Online (Sandbox Code Playgroud)

然而,遗憾的是,这并不是我需要它做的事情.原因如下:

AbstractAnimal.prototype.clicked = function() { console.log("clicked") };
//If I change Man...
animals.Man.clicked = function() { console.log("HA!"); };
//Monkey is effected too...
animals.Monkey.clicked();
//Console: "HA!"
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,当单击Monkey时,我希望控制台说"单击".单击Man时,应该说"HA!".

所以我发现了一些我认为会在这里做的事情:javascript类继承自Function类

它几乎起作用,但并不完全.这是一个简化的测试用例:http://jsfiddle.net/9KRJk/2/

我能帮帮我吗?谢谢!

PS不,实际上,整个动物都是隐喻的,我实际上并不是在编写一个动物园.:)

javascript oop inheritance

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