JavaScript Patterns 3.3 Patterns for Enforcing new
2014-05-29 13:24 小郝(Kaibo Hao) 阅读(310) 评论(0) 编辑 收藏 举报When your constructor has something like this.member and you invoke the constructor without new, you’re actually creating a new property of the global object called member and accessible through window.member or simply member.
// constructor function Waffle() { this.tastes = "yummy"; } // a new object var good_morning = new Waffle(); console.log(typeof good_morning); // "object" console.log(good_morning.tastes); // "yummy" // antipattern: // forgotten `new` var good_morning = Waffle(); console.log(typeof good_morning); // "undefined" console.log(window.tastes); // "yummy"
This undesired behavior is addressed in ECMAScript 5, and in strict mode this will no longer point to the global object. If ES5 is not available, there’s still something you can do to make sure that a constructor function always behaves like one even if called without new.
Naming Convention
uppercase the first letter in constructor names (MyConstructor) and lowercase it in “normal” functions and methods (myFunction).
Using that
function Waffle() { var that = {}; that.tastes = "yummy"; return that; } function Waffle() { return { tastes: "yummy" }; } var first = new Waffle(), second = Waffle(); console.log(first.tastes); // "yummy" console.log(second.tastes); // "yummy"
Disadvantage
The link to the prototype is lost, so any members you add to the Waffle()prototype will not be available to the objects.
Self-Invoking Constructor
In the constructor you check whether this is an instance of your constructor, and if not, the constructor invokes itself again, this time properly with new:
function Waffle() { if (!(this instanceof Waffle)) { return new Waffle(); } this.tastes = "yummy"; } Waffle.prototype.wantAnother = true; // testing invocations var first = new Waffle(), second = Waffle(); console.log(first.tastes); // "yummy" console.log(second.tastes); // "yummy" console.log(first.wantAnother); // true console.log(second.wantAnother); // true
出处:http://www.cnblogs.com/haokaibo/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。