我有这段代码:
var Human=function(name){
this._name=name;
};
Human.prototype.Shout=function(){
alert(this._name);
};
var tom=new Human("tom");
var john=new Human("john");
alert(tom.Shout===john.Shout);
Run Code Online (Sandbox Code Playgroud)
现在._name不是"私人".我想使._name"私有",但同时我不希望为每个人类实例创建额外的函数(换句话说,tom.Shout必须是===到john.Shout)因为创建了附加函数每个实例都很好..不必要(ok offtopic - 我们可以在另一个线程上讨论这个)
我的结论是,我想要实现的目标(将._name设为"私有"并且同时拥有tom.Shout===john.Shout)是不可能的.
但在得出任何结论之前,我只想200%肯定.
(只要符合要求,我欢迎任何黑客攻击,即不为每个实例创建额外的功能)
如果我们必须创建其他函数来进行范围确定,那么该数字应该是固定数字,并且该数字不应随着每个额外的Human实例而增加.
我听说ECMAScript 5现在得到了大多数最新浏览器的支持.那里有什么好的教程吗?我试着看自己,但我没有找到任何东西.ES5文档是唯一的东西吗?我主要想知道新标准中已经折旧了什么.如果我避开这些,当我搬到ES5时我会感到宾至如归,我不会错过任何折旧的东西.
ES5添加数量的方法来Object,这似乎打破的JavaScript的语义的一致性.
举例来说,在此之前的扩展,JavaScript API的身边总是围绕operarting 对对象本身;
var arrayLength = [].length;
var firstPosInString = "foo".indexOf("o");
Run Code Online (Sandbox Code Playgroud)
...新的Object方法就像;
var obj = { };
Object.defineProperty(obj, {
value: 'a',
writable: false
});
Run Code Online (Sandbox Code Playgroud)
......当以下内容更加符合时:
var obj = { };
obj.defineProperty({
value: 'a',
writable: false
});
Run Code Online (Sandbox Code Playgroud)
任何人都可以冷静我的好奇心,为什么会这样?是否有任何代码片段会破坏?标准委员会是否就他们选择这种方法的原因进行了公开讨论?
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty说明:
configurable:当且仅当可以更改此属性描述符的类型并且可以从相应对象中删除属性时为True.默认为
false.
所以,我有一个
var x = Object.defineProperty({}, "a", {
value:true,
writable:true,
enumerable:true,
configurable:false
});
Run Code Online (Sandbox Code Playgroud)
现在,我可以玩x.a = false,for(i in x)等等.但即使描述符是应该是不可配置的,我可以做
Object.defineProperty(x, "a", {writable:true}); // others defaulting to false
Object.defineProperty(x, "a", {}); // everything to false
Object.freeze(x); // does the same to the descriptors
Run Code Online (Sandbox Code Playgroud)
反过来,再次将它们设置为true,或尝试定义访问器描述符,现在引发错误.确切地说:Object.defineProperty: invalid modification of non-configurable property.
为什么我可以"降级"描述符虽然他们说它们是不可配置的?
可能重复:
Javascript多重继承
有没有办法在JavaScript中执行此操作:
Foo = function() {
};
Bar = function() {
};
Baz = function() {
Foo.call(this);
Bar.call(this);
};
Baz.prototype = Object.create(Foo.prototype, Bar.prototype);
var b = new Baz();
console.log(b);
console.log(b instanceof Foo);
console.log(b instanceof Bar);
console.log(b instanceof Baz);
Run Code Online (Sandbox Code Playgroud)
那么Baz既是Foo又是Bar的一个例子?
javascript inheritance prototype multiple-inheritance ecmascript-5
有没有办法直接为ES6代码提供源映射?即我编写ES6代码,用例如es6-transpiler进行转换,然后将ES5缩小并合并到一个文件中.但是我希望在原版ES6中有源代码.可能吗?
任何转录器/ minifiers和构建工具(grunt,gulp)就足够了.
我根本不同意"偏离主题"的决定,因为问题是关于某些实际问题.尽管如此,我今天提供了一个aswer:
最近我开始学习ReactJS,因此 - ES6.我对ES5非常熟悉,但有些事情对我来说并不是那么清楚.
示例1:方法语法
以下两种方法有什么区别?
export class InvoiceForm extends React.Component {
methodName1() {
}
methodName2 = () => {
};
}
Run Code Online (Sandbox Code Playgroud)
示例2:外部的类属性
class Greeting extends React.Component {
render() {
return (
<h1>Hello, {this.props.name}</h1>
);
}
}
Greeting.propTypes = {
name: PropTypes.string
};
Run Code Online (Sandbox Code Playgroud)
propTypes在课外.但为什么?我来自python和我一样,以下更正确
class Greeting extends React.Component {
static propTypes = {
name: PropTypes.string
}
render() {
return (
<h1>Hello, {this.props.name}</h1>
);
}
}
Run Code Online (Sandbox Code Playgroud) 我知道递归的基本概念,即调用自身的函数是递归。
现在我正在浏览 NodeJS文档,我发现了一种叫做Direct Recursion和Mutual Recursion 的东西。我找到了关于相互递归的维基百科文档。但不确定它如何与 JavaScript 一起使用。我有以下关于递归的问题。
函数声明和变量提升如何与相互递归一起工作?
直接递归是指术语递归吗?
这是直接递归的例子吗?:
function abc(num,sum){
if(num<=0) return sum;
return abc(--num,sum);
}
Run Code Online (Sandbox Code Playgroud) 这样做的原因很复杂,但归结为流不理解mixins或任何其他修改ES6类原型的方法.所以我回到了ES5,但我无法弄清楚如何在没有的情况下调用ES6类的构造函数new:
class A {
constructor() {}
}
function B() {
// what do I put here? I would do something like
// A.prototype.constructor.call(this) but that throws an error saying the
// constructor can only be called with `new`
}
B.prototype = Object.create(A.prototype);
Run Code Online (Sandbox Code Playgroud) 是否可以通过更改"this"上下文(call,apply或其他)来在另一个实例上使用es6构造函数指令?这可以使用es5"类".这是我的意思的一个小例子:
function ES5() {
this.foo = 'foo';
}
class ES6 {
constructor() {
this.bar = 'bar';
}
}
var a = new ES6();
ES5.call(a);
console.log(a.foo + a.bar); //foobar
var b = new ES5();
//Reflect.construct(ES6); ??
ES6.call(b); //TypeError: Class constructor ES6 cannot be invoked without 'new'
console.log(b.foo + b.bar); //how to get foobar here too?Run Code Online (Sandbox Code Playgroud)
编辑: 我的问题与新关键字无关.我正在寻找的答案是如何使用另一个"this"上下文(带或不带new关键字)运行es6构造函数中的指令.
ecmascript-5 ×10
javascript ×9
ecmascript-6 ×4
consistency ×1
constructor ×1
function ×1
inheritance ×1
porting ×1
prototype ×1
recursion ×1
source-maps ×1