for (key in obj) // do
It’s better to use the first method below (when initializing): obj = Object.create(null)
obj = {}
So you don’t inherit random keys from the chain, unless you intend to. Or use: Object.keys(obj).forEach(k
Which doesn’t have this issue like the for-in loop version does. obj = Object.create(null)
obj = {}
is exactly the same as obj = {}
I would also do `Object.keys().forEach()`.If it wasn’t clear, i was mentioning 2 ways of initializing, not that you should reassign immediately.
Naming is a difficult but critical aspect of conceptualizing a solution [1]. Programming, even when ad-hoc, relies on an internal conceptual model to guide the programmer. It pays to be pedantic with language.
A "prototype" per common understanding and dictionary definition strongly implies the act of "copying". Per that sense, the "prototype" of an Object is distinct object with its own distinct life-cycle and state space trajectory.
So it should be clarified here that the OP exploit is not an inherent weakness of prototype based OO approach, in principle. The Javascript "prototype" is really a "parent delegate". It is a Delegated-Parent Inheritance language, and the OP exploit is a feature/bug of delegate based composition approaches, by definition.
This inability by otherwise (obviously) intelligent people in naming things is an unfortunate pattern in computer science and software development. A historic favorite is "dynamic programming".
({}).delegate === ({}).constructor.withDelegate
({}).parent === ({}).creation.withParent
Oh and `Object` - it is `ObjectConstructor` - though all regular functions are constructors constructor sum(a, b) { return a + b } Object.define_method('env') { { RUBYOPT: "-e puts 123" } }
Though ruby rejects it $ RUBYOPT="-e 'puts 123'" env ruby
Traceback (most recent call last):
ruby: invalid switch in RUBYOPT: -e (RuntimeError)
https://github.com/ruby/ruby/blob/b753929806d0e42cdfde3f1a8d...And to use -r file needs to be .rb
delete Object.prototype.__proto__;
Fixed. delete Object.prototype.__proto__;
a = {};
a.constructor.prototype.x = 1;
a.x == 1
Outputs true