- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道有很多关于“Javascript:好的部分”的问题和文档,但我试图理解书中一句话的意思,但不太明白。在第 41-42 页中,他定义了 serial_maker 函数:
var serial_maker = function ( ) {
// Produce an object that produces unique strings. A
// unique string is made up of two parts: a prefix
// and a sequence number. The object comes with
// methods for setting the prefix and sequence
// number, and a gensym method that produces unique
// strings.
var prefix = '';
var seq = 0;
return {
set_prefix: function (p) {
prefix = String(p);
},
set_seq: function (s) {
seq = s;
},
gensym: function ( ) {
var result = prefix + seq;
seq += 1;
return result;
}
};
};
var seqer = serial_maker();
seqer.set_prefix('Q');
seqer.set_seq(1000);
var unique = seqer.gensym(); // unique is "Q1000"
然后他说:
The methods do not make use of this and that. As a result, there is no way to compromise the sequer. It isn't posible to get or change the prefix or seq except as permitted by the methods
我应该如何使用this 和/或that 来打破这种封装?我看不到
谢谢
最佳答案
考虑以下变化:
var serial_maker = function () {
return {
prefix: '',
seq: 0,
set_prefix: function (p) {
this.prefix = String(p);
},
set_seq: function (s) {
this.seq = s;
},
gensym: function ( ) {
var result = this.prefix + this.seq;
this.seq += 1;
return result;
}
};
};
现在,sequer 的预期用途如下:
var sequer = serial_maker();
sequer.set_prefix('right');
sequer.set_seq(1000);
但是,在我上面发布的版本中,您也可以这样做:
var sequer = serial_maker();
sequer.prefix = 'wrong';
sequer.seq = -500;
甚至这样:
delete sequer.prefix;
因为两个prefix
和 seq
作为 sequer 对象的属性公开,JavaScript 中的属性始终是公共(public)的。任何有权访问该对象的代码至少可以读取其属性,并且通常也可以修改它们(除非您使用 Object.defineProperty()
提供的某些功能)。
至于that
: 在引入箭头函数之前,定义为方法的函数无法访问创建它们的上下文是一个非常普遍的问题。
考虑以下示例:
var ButtonInitializer = {
message: 'Hello!'
init: function() {
for (let button of document.querySelectorAll('button')) {
button.onclick = function() {
alert(this.message);
}
}
}
};
ButtonInitializer.init();
对象 ButtonInitializer
在文档中搜索 <button>
元素并设置它们的 onclick
事件监听器以显示警报;我们的目的是显示 ButtonInitializer.message
中定义的消息.但是,如果运行上面的代码,您会发现警报是“undefined
”。这是因为我们分配给 button.onclick
的函数成为按钮的方法,所以 this
函数内的关键字现在将引用按钮,而不是 ButtonInitializer
.
今天,我们可以用箭头函数解决这个问题:
button.onclick = () => {
alert(this.message);
}
箭头函数没有自己的 this
范围,因此警报将显示 ButtonInitializer.message
,正如我们的意思。在引入箭头函数之前,这是一个常见的解决方法:
var that = this;
button.onclick = function() {
alert(that.message);
}
这种技术与闭包一起使用非常普遍,并允许有限地实现对象的方法可以访问的“私有(private)”成员,但不能直接从外部代码中看到。
关于javascript - Crockford 的安全对象模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50806580/
只有 3 行代码,但我无法完全理解这一点: Object.create = function (o) { function F() {} F.prototype = o; re
我知道有很多关于“Javascript:好的部分”的问题和文档,但我试图理解书中一句话的意思,但不太明白。在第 41-42 页中,他定义了 serial_maker 函数: var serial_ma
这是什么意思: "When a function object is created, the Function constructor that produces the function obje
下面的代码几乎与道格拉斯·克罗克福德 (Douglas Crockford) 的精湛著作《JavaScript:好的部分》第 29-30 页中的一些代码相同。唯一的区别是他像这样添加了 get_sta
出于兴趣,我想学习如何为一种简单的语言编写解析器,并最终为我自己的代码打高尔夫球语言编写解释器,一旦我了解了这些东西的一般工作原理。 所以我开始阅读 Douglas Crockfords 的文章 To
最近我看了一个 Douglas Crockford 的演讲(他的演讲让我着迷,但总是让我感到困惑)。他举了一个构造函数的例子,但我不太明白我将如何在实践中使用它: function construct
我正在尝试使用 Crockford 的继承模式构建基类 Shape。使用这个基本形状,我试图画一个圆、一个矩形和一个三 Angular 形。我有点卡住了。我不知道如何调用/修改基本方法 functio
我刚读完 The Good Parts,我对某事有点困惑。 Crockford 的伪经典继承示例如下: var Mammal = function (name) { this.name = n
希望有人能帮我分解 Crockford 的 JS Good Parts 中的一段代码: Function.method('new', function ( ) { // Create a new
在函数式继承模式中,Crockford 引入了一个新的superior 方法: Object.method('superior', function (name) { var that = t
我刚刚看了 Douglas Crockford 的视频,他给出了以下练习: write a function, that when passed a variable, returns a funct
我观看了 YUIConf 2012 的视频,其中 Douglas Crockford 发表了关于在 JavaScript 中实现 monad 的演讲。在本次演讲中,他给出了一个代码示例,该示例使用了他
在接下来的文章中,Douglas Crockford 创建了一个函数来更接近地模拟 JavaScript 中的原型(prototype)继承 (http://javascript.crockford.
在 Douglas Crockford 的 JavaScript: The Good Parts 中,他用这段代码解释了伪经典继承的思想,其中显示 Cat 继承自 Mammal. var Cat =
/** Supplant **/ String.prototype.supplant = function(o) { return this.replace (/{([^{}]*)}/g,
在 Javascript the good parts 一书中,Ch3 on objects 的开篇,它指出: An object is a container of properties, wher
我最近尝试为一个经常创建的值对象优化一些代码。 (三维向量,fwiw) 我尝试的一件事是将构造函数从匿名方法工厂模式转换为普通的 JavaScript 构造函数。 这导致了 severe perfor
只是在 JS 中尝试不同的继承技术,并且发现了一些关于 Crockford 的原型(prototype)继承模式的稍微令人不安的事情: function object(o) { functio
在 Douglas Crockford 的文章中,Private Members in Javascript ,他使用变量“that”来引用“this”,以便在类的特权方法中使用。我一直在我的代码中使
https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js在此链接中,Douglas Crockford 创建了一个 j
我是一名优秀的程序员,十分优秀!