Comments (16)
what '造' mean in Chinese ?
from underscore-analysis.
@image72 means "知道"
from underscore-analysis.
关于prop in obj,应该是为了避免一种特殊情况,就是obj的原型链是null的情况。(如果不要这个判断的话,会是以下结果)
var o = {}
var keys = []
collectNonEnumProps(o, keys)
// keys = []
o.__proto__ = null
// or Object.setPrototypeOf(o, null)
collectNonEnumProps(o, keys)
// keys = ["toLocaleString", "hasOwnProperty", "propertyIsEnumerable", "toString", "isPrototypeOf", "valueOf"]
from underscore-analysis.
@2json 请问那么为什么不能全部用hasOwnProperty的方法判断呢?也就是不单独处理constructor,而是将所有属性都像constructor一样处理。实际上,我根本就不明白为什么单单要把constructor单独处理……
from underscore-analysis.
而被重写的 constructor 能否用 obj[prop] !== proto[prop] 来判断呢?楼主觉得也是可以的,如果没有被重写,那么 obj.constructor === obj.constructor.prototype.constructor 返回 true,如果被重写,obj.constructor === Object.prototype.constructor 返回 false。
楼主,你感觉下面的这种情况有意义吗?但是这种情况用的场景还是挺多的,就是显示声明一个对象的constructor。这个时候,严谨的说是更改constructor的指向
var obj = {constructor:Object}
//这时候
obj.constructor === Object.prototype.constructor //true
from underscore-analysis.
I don't understand why you use two different conditions to check if an object's property is being overwritten. Also in this case, I think obj.constructor === obj.constructor.prototype.constructor
will always return true and obj.constructor === Object.prototype.constructor
will always return false, overwritten or not.
from underscore-analysis.
这个 我跟楼主一样 看的也是一脸懵逼
from underscore-analysis.
prop in obj && obj[prop] !== proto[prop]
应该是 obj 的 constructor 被重写时候的判断吧。
var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
这只是预防 obj 被直接量重写 constructor 的指向变化。
from underscore-analysis.
_.has(obj, prop) 与 (prop in obj) 有什么区别呢?
from underscore-analysis.
@tsanie 你说的是对的。
把collectNonEnumProps方法通过“_”导出成公有方法以后,执行以下代码:
var obj = Object.create(null); var keys = []; _.collectNonEnumProps(obj, keys);
如果把“prop in obj”注掉的话,keys = ["hasOwnProperty", "propertyIsEnumerable", "toString", "isPrototypeOf", "valueOf"],
打开注释的话,keys=[]。
这里发现少了toLocalString,是因为Object.prototype中也没有这个属性。
不过这里用Object.create(null)举例可能不太合适,毕竟这是ES5的方法,但collectNonEnumProps方法时专门为ES3准备的,可能obj.__proto__ = null
更合适。
from underscore-analysis.
_.has的实现:
_.has = function(obj, key) {
return obj != null && hasOwnProperty.call(obj, key);
};
hasOwnProperty 会获取 obj对象 本身的 可迭代和不可迭代的属性, 不会获取原型上面的任何属性;
for ... in 会获取obj对象本身和 原型上面的可迭代的属性, 不会获取不可迭代的属性。
可以去看 mdn 详解。
from underscore-analysis.
你好,请问下_.keys和_.allKeys方法的主要区别在哪里?虽然从代码和代码注释上可以看到,.allKeys遍历所有的属性名,而.keys只遍历自有属性(包括被重写的继承来的属性),但是我没有找到两个方法返回结果不同的例子。所有尝试的结果两者返回的都是一样的,可以帮忙举个返回结果不同的例子吗?谢谢
from underscore-analysis.
其实我还是不理解为什么不全部用_.has来判断,还有确实像上面所说可能会出现这种情况:
var obj = {constructor:Object}
//这时候
obj.constructor === Object.prototype.constructor //true
但是其他方法也一样会出现这种情况,比如:
var toString = Object.prototype.toString
var obj = {toString: toString}
我认为这一样是没法用prop in obj && obj[prop] !== proto[prop]这句来判断的,因为一定会返回false。如果用_.has来判断反而靠谱的多。
from underscore-analysis.
发现另外一个bug:
假如obj的constructor重写,并且constructor.ptototype重写toString
var Func = function() {}; Func.prototype.toString = null; var obj = { constructor: Func };
// 返回值是 =>是["constructor", "toString"]
问题出在这句 obj[prop] !== proto[prop]
from underscore-analysis.
@tsanie 你说的这个我测试出来有些不同,下面是我的测试结果
var o = {}
var keys = []
collectNonEnumProps(o, keys)
// keys = ['toString']
o.__proto__ = null
collectNonEnumProps(o, keys)
// keys = []
另外我看的 underscore
中 collectNonEnumProps
方法代码如下:
function collectNonEnumProps(obj, keys) {
var nonEnumIdx = nonEnumerableProps.length;
var proto = typeof obj.constructor === 'function' ? FuncProto : ObjProto;
while (nonEnumIdx--) {
var prop = nonEnumerableProps[nonEnumIdx];
// if判断我觉得可以改成 if (_.has(obj, prop) && !_.contains(keys, prop)) { }
if (prop === 'constructor' ? _.has(obj, prop) : prop in obj &&
obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
keys.push(prop);
}
}
}
from underscore-analysis.
楼主,我在IE9以下的浏览器中测试发现,for..in遍历对象属性时,toString是可以alert出来的啊,你是怎么测试的呢?
var obj = {
toString: null
}
for(key in obj) {
alert(key)
}
from underscore-analysis.
Related Issues (20)
- JavaScript 数组乱序 HOT 13
- 浅谈 underscore 内部方法 group 的设计原理 HOT 3
- 带注释的源码中var _ = function (obj) {....}中有个疑问 HOT 4
- 关于 bind 你可能需要了解的知识点以及使用场景 HOT 2
- bind 方法的兼容实现 HOT 1
- JavaScript 函数节流和函数去抖应用场景辨析 HOT 17
- underscore 函数去抖的实现 HOT 20
- underscore 函数节流的实现 HOT 8
- 从斐波那契数列求值优化谈 _.memoize 方法 HOT 6
- Function Functions 相关源码拾遗
- 浅谈 Web 中前后端模板引擎的使用 HOT 19
- Underscore _.template 方法使用详解 HOT 3
- Underscore 整体架构浅析 HOT 15
- 源码解读这半年 HOT 20
- 疑问:模块导出中,向后兼容老的require() API HOT 1
- 源码
- 打扰一下,有一个问题想咨询你一下 HOT 9
- 你好请教个问题 HOT 1
- 你好...在谷歌浏览器中运行`Object.prototype.toString().call(abb)`会报错 //var abb = true HOT 2
- 關於underscore源碼中提到了25個扩展方法之疑問? HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from underscore-analysis.