在JavaScript文件中,我看到:
function Somefunction(){
var that = this;
...
}
Run Code Online (Sandbox Code Playgroud)
声明that和分配给它的目的是什么this?
我现在使用Traceur Compiler来获得ES6功能.
我想从ES5实现这些东西:
function Animal() {
var self = this,
sayHi;
sayHi = function() {
self.hi();
};
this.hi = function() {/* ... */}
}
Run Code Online (Sandbox Code Playgroud)
目前traceur不支持private和public关键字(来自和谐).ES6类语法不允许在类体中使用简单var(或let)语句.
我找到的唯一方法是在类声明之前模拟私有.就像是:
var sayHi = function() {
// ... do stuff
};
class Animal {
...
Run Code Online (Sandbox Code Playgroud)
没有什么比通过预期的更好,this没有apply-ing或bind-ing它每次都不能将正确的方法传递给私有方法.
那么,是否有可能在ES6类中使用与traceur编译器兼容的私有数据?
我编写了以下代码,通过使用OOP在单独的js文件logger.js中实现日志记录.
var console;
function Logger() {
init();
}
var init = function() {
if(!window.console){
console = {
log: function(message){},
info: function(message){},
warn: function(message){},
error: function(message){}
};
} else {
console = window.console;
}
};
Logger.prototype.log = function(message) {
console.log(message);
}
Logger.prototype.logInfo = function(message) {
console.info(message);
}
Logger.prototype.logWarn = function(message) {
console.warn(message);
}
Logger.prototype.logError = function(message) {
console.error(message);
}
Run Code Online (Sandbox Code Playgroud)
我从另一个js文件,site.js使用它作为:
var logger = new Logger(); //global variable
var getComponentById = function(id) {
var component = null;
if(id) {
try {
component …Run Code Online (Sandbox Code Playgroud) Helo那里,
只是一个简单的问题,我正在使用伪经典模式在JS中创建对象,我想知道如何实际创建只能在对象内部访问的私有方法.
假设我想在对象Animal中添加一个私有方法XY().这种模式是否允许我创建私有方法?
function Animal(name) {
this.name = name
}
Animal.prototype = {
canWalk: true,
sit: function() {
this.canWalk = false
alert(this.name + ' sits down.')
}
}
Run Code Online (Sandbox Code Playgroud)
先谢谢你,Alex
首先,请参阅我的代码plz.
function test(){
this.item = 'string';
this.exec = function(){
something();
}
function something(){
console.log(this.item);
console.log('string');
}
}
Run Code Online (Sandbox Code Playgroud)
我做了类并调用'exec函数',就像这段代码一样
var t = new test();
t.exec();
Run Code Online (Sandbox Code Playgroud)
但结果是......
undefined
string
Run Code Online (Sandbox Code Playgroud)
我想从一些函数访问test.item.
你有什么解决方案吗?
我正在尝试一些示例,并遇到一个问题,如果我们想要向原型添加一个函数,它将无法访问构造函数的私有成员.我遇到了这个解决方案.这似乎是一个很好的黑客.
我尝试了其他一些方法,我得到以下内容:
var Restaurant = function()
{
var myPrivateVar;
var private_stuff = function() // Only visible inside Restaurant()
{
return "I can set this here!";
}
Restaurant.prototype.use_restroom = function() // use_restroom is visible to all
{
private_stuff();
}
Restaurant.prototype.buy_food = function() // buy_food is visible to all
{
return private_stuff();
}
}
var restaurant = new Restaurant();
restaurant.buy_food(); // this would work
restaurant.private_stuff(); // this won't
Run Code Online (Sandbox Code Playgroud)
解决方案似乎很奇怪,因为我们在构造函数中添加了原型.(我没有看到太多这个).它至少适用于firefox 5和chrome.它有什么问题吗?
OOP建议只公开您希望用户能够访问的变量和方法.我一直在为我的对象使用公共方法声明(即原型).
DrawShape = function() {
}
DrawShape.prototype.circle = function() {
// draw logic here
}
DrawShape.prototype.square = function() {
// draw logic here
}
Run Code Online (Sandbox Code Playgroud)
这种方法似乎是最有效的,因为每次实例化实例时都不会重写该方法.但是我发现要创建好的DRY,模块化代码我必须创建仅供其他方法访问的方法(即私有方法).
DrawShape = function() {
}
DrawShape.prototype.circle = function() {
var colour = this.setColour();
// draw logic here
}
DrawShape.prototype.square = function() {
var colour = this.setColour();
// draw logic here
}
DrawShape.prototype.setColour = function() {
return "blue";
}
Run Code Online (Sandbox Code Playgroud)
在这里,我创建了一个名为setColour的方法,该方法仅用于由其他方法运行.问题是该方法是公开的,可以被任何人或任何人调用.
我可以将方法移动到对象构造函数中...但这意味着我不再保存内存(即每次实例化实例时都会重写),这也意味着我必须移动所有其他方法进入构造函数.
在创建对象时,JavaScript中的最佳实践是什么?
javascript ×7
oop ×2
class ×1
constructor ×1
ecmascript-5 ×1
ecmascript-6 ×1
html5 ×1
object ×1
prototype ×1
this ×1
traceur ×1