IT

JavaScript의 "new" 키워드는 유해한 것으로 간주됩니까?

itgroup 2023. 1. 12. 22:11
반응형

JavaScript의 "new" 키워드는 유해한 것으로 간주됩니까?

다른 질문에서, 한 사용자가 지적한 것은new에 대한 이 솔루션에서는, 「이러다」를 하지 않습니다.new 등 본 이 있기 에, 「,는이이이,,,,,,,,, the, the the,,,,,,,,,,,,, the, the the,」를 사용하고 있기 그것이 하지 않았습니다 왜냐하면 나는 프로토타입, Scriptaculus, 그리고 다른 뛰어난 JavaScript 라이브러리를 사용해봤기 때문이다. 그리고 그들 모두가 그것을 사용했다.new키워드를 지정합니다.

그럼에도 불구하고 어제 더글라스 크록포드의 강연을 YUI 극장에서 보고 있었는데 똑같은 말을 하더라고요.new키워드(Crockford on JavaScript - Act III: Function the Ultimate - 50:23 minute)를 더 이상 코드에 포함시키지 않습니다.

나쁜'을 안 요?new?? 의 장점과 요?그것을 사용할 때의 장점과 단점은 무엇입니까?

Crockford는 좋은 JavaScript 기술을 대중화하기 위해 많은 노력을 해왔다.언어의 핵심 요소에 대한 그의 독단적인 입장은 많은 유용한 논의를 불러일으켰다.그렇다고 해도, "나쁘다" "해롭다"는 선언 하나하나를 복음으로 받아들이고, 한 사람의 의견 밖을 보는 것을 거부하는 사람들이 너무 많다.그것은 때때로 약간 좌절감을 줄 수 있다.

에서 new키워드에는 각 오브젝트를 처음부터 작성하는 것보다 몇 가지 이점이 있습니다.

  1. 원형 상속.클래스 베이스의 OO언어에 익숙한 사람들은 의심과 조롱이 뒤섞인 눈으로 자주 보지만 JavaScript의 네이티브 상속 기술은 간단하고 놀라운 코드 재사용 수단이다.그리고 그new키워드는 표준(및 사용 가능한 크로스 플랫폼만) 사용 방법입니다.
  2. 성능.이것은 #1의 부작용입니다.만일 작성하는 오브젝트마다 10개의 메서드를 추가하는 경우, 각 메서드를 수동으로 새로운 오브젝트에 할당하는 작성 함수를 작성할 수 있습니다.또는 생성 함수에 할당할 수도 있습니다.prototype를 사용합니다.new을 사용법이렇게 하면 속도가 빨라질 뿐만 아니라(프로토타입의 모든 메서드에 코드가 필요 없음), 메서드별로 개별 속성을 사용하여 각 오브젝트를 벌룬화하는 것을 피할 수 있습니다.저속 머신(특히 저속 JS 인터프리터)에서는 오브젝트가 많이 생성되면 시간과 메모리가 대폭 절약됩니다.

네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네.new에는 중요한 단점이 하나 있습니다.하다사용하는 것을 잊으면 경고 없이 코드가 깨집니다.하다 기능 자체에 약간의 코드를 추가하면 됩니다.

function foo()
{
   // if user accidentally omits the new keyword, this will 
   // silently correct the problem...
   if ( !(this instanceof foo) )
      return new foo();
   
   // constructor logic follows...
}

, 그럼 이제 은 new실수로 잘못 사용했을 때 발생하는 문제에 대해 걱정할 필요가 없습니다.

John Resig는 기술에 대해 심플한 "클래스" 인스턴스화 투고에서 자세히 설명하고 이 동작을 기본적으로 "클래스"로 구성하는 방법을 포함합니다.확실히 읽을 가치가 있다...곧 출간될 그의 인 "JavaScript Ninja의 비밀"은 이 언어와 많은 다른 "해로운" 자바스크립트 언어의 특징에서 숨겨진 금을 발견한다.with특히 처음에 이 많은 악평을 받은 기능을 속임수라고 일축했던 우리들에게 계몽적인 일입니다.)

범용 건전성 검사

고장난 코드가 묵묵히 작동한다는 생각에 신경이 쓰이는 경우 수표에 주장을 추가할 수도 있습니다.또는 일부의 코멘트에 따라 체크를 사용하여 런타임 예외를 도입합니다.

if ( !(this instanceof arguments.callee) ) 
   throw new Error("Constructor called as a function");

이 스니펫은 이전 예시와 달리 오브젝트를 실제로 인스턴스화할 필요가 없기 때문에 컨스트럭터 함수 이름의 하드코딩을 피할 수 있습니다.따라서 수정 없이 각 타깃 함수에 복사할 수 있습니다.

ES5가 없어지다

Sean McMillan, Stephenbezjrh지적했듯이,arguments.calleeES5의 strict 모드에서는 무효입니다.따라서 위의 패턴은 해당 컨텍스트에서 사용할 경우 오류를 발생시킵니다.

및 무해한 ES6new

ES6는 JavaScript에 클래스를 도입하고 있다.-아니, 구식 Crockford가 채택한 이상한 Java-aping 방식이 아니라, 그가 나중에 채택한 경량 방식에 훨씬 더 가깝고, 프로토타입 유전의 가장 좋은 부분을 가져와 공통 패턴을 언어 자체에 굽는다.

... 그 한 '금고'가 되어 있습니다new:

class foo
{
  constructor()
  {
    // constructor logic that will ONLY be hit 
    // if properly constructed via new
  } 
}

// bad invocation
foo(); // throws, 
// Uncaught TypeError: class constructors must be invoked with 'new'

하지만 만약 여러분이 새로운 설탕을 사용하고 싶지 않다면요?만약 당신이 완전히 멀쩡한 구형 프로토타입 코드를 위에 나온 안전 점검과 함께 업데이트하여 엄격한 모드로 계속 작동하기를 원한다면 어떻게 해야 할까요?

Nick Parsons가 지적한 바와 같이 ES6는 다음과 같은 형태로 이를 쉽게 확인할 수 있습니다.

function foo()
{
  if ( !(new.target) ) 
     throw new Error("Constructor called as a function");
   
  // constructor logic follows...
}

선택하든, 위생적인 방법으로 수 .new무해하게

나는 방금 그의 크로크포드 책 "Javascript:좋은 부분"을 참조하십시오.나는 그가 자신에게 물린 모든 것을 해롭다고 생각하는 것 같은 느낌이 든다.

스위치 폴스루에 대해서:

나는 전환 케이스가 다음 케이스로 넘어가는 것을 결코 용납하지 않는다.필자는 폴 스루(fall through)가 왜 유용한지에 대한 활발한 연설을 한 직후에 의도하지 않은 폴 스루(fall through)로 인한 버그를 발견한 적이 있습니다.(97페이지, ISBN 978-0-596-51774-8)

++ 및 --에 대해서

++(증가) 연산자와 --(감소) 연산자는 불필요한 속임수를 조장하여 악성 코드의 원인이 되는 것으로 알려져 있습니다.바이러스 및 기타 보안 위협을 활성화하는 데 있어 아키텍처의 오류에 버금가는 제품입니다.(122쪽)

신규 정보:

컨스트럭터 함수를 호출할 때 프레픽스를 포함하지 않으면 객체에 바인딩되지 않습니다.안타깝게도, 이것은 글로벌 객체에 구속되기 때문에 새로운 객체를 증강하는 대신 글로벌 변수를 클래빙하게 됩니다.그건 너무 심해요.컴파일 경고도 런타임 경고도 없습니다(49페이지).

더 있지만 이해하시길 바랍니다.

당신의 질문에 대한 나의 답변: 아니요, 해롭지는 않습니다. 하지만 만약 당신이 그것을 사용하는 것을 잊어버린다면 당신은 몇 가지 문제가 생길 수 있습니다.만약 당신이 좋은 환경에서 발전하고 있다면, 당신은 그것을 알아차릴 수 있을 것이다.

갱신하다

답변이 작성된 지 약 1년 후, 엄격한 모드를 지원하는 ECMAScript 5판이 출시되었습니다.strict 모드에서는this, 「」에 .undefined.

Javascript는 역동적인 언어이기 때문에 다른 언어가 당신을 멈추게 할 수 있는 수많은 방법을 가지고 있다.

다음과 같은 기본적인 언어 기능의 회피new만약 신발이 더러워질 경우를 대비해서 지뢰밭을 걷기 전에 반짝이는 새 신발을 벗는 것과 같다.

저는 함수 이름이 소문자로 시작하고 실제로 클래스 정의인 '함수'가 대문자로 시작하는 규칙을 사용합니다.결과는 '구문'이 잘못되었다는 매우 설득력 있는 시각적 단서가 됩니다.

var o = MyClass();  // this is clearly wrong.

이 좋은 이름 짓기 습관 외에도 도움이 됩니다.모든 기능이 일을 하고 나면 그 이름에는 동사가 있어야 하며, 반면 클래스는 목적어를 나타내며 동사가 없는 명사와 형용사이다.

var o = chair() // Executing chair is daft.
var o = createChair() // makes sense.

SO의 구문 배색이 위의 코드를 어떻게 해석했는지는 흥미롭다.

저는 Javascript를 처음 접하는 사람이라 좋은 관점을 제공하는 것에 익숙하지 않은 것 같습니다.하지만 저는 이 "새로운" 것에 대한 제 견해를 공유하고 싶습니다.

저는 'new'라는 키워드를 사용하는 것이 너무 자연스러워서 이상하게 보이는 공장 디자인 패턴인 C# 세계에서 왔습니다.

Javascript로 처음 코드를 작성했을 때, YUI 패턴과 같은 새로운 키워드나 코드가 있는 것을 깨닫지 못하고, 재해가 발생하는 데 오래 걸리지 않습니다.작성한 코드를 되돌아보면 특정 행이 무엇을 해야 하는지 알 수 없습니다.더 혼란스러운 것은 코드를 '드라이런'할 때 오브젝트 인스턴스 경계를 실제로 통과할 수 없다는 것입니다.

그리고 나서, 나는 "새로운" 키워드를 발견했는데, 그것은 나에게 사물을 "분리"하는 것이었다.새로운 키워드로 무언가를 만듭니다.새로운 키워드가 없다면, 내가 호출하는 기능이 그것에 대한 강력한 단서를 주지 않는 한, 나는 그것을 창조하는 것과 혼동하지 않을 것이다.

를 들어, 「」를 붙이면,var bar=foo();'그' 입니다.반환값입니까, 아니면 새로 생성된 개체입니까? ,가 있으면var bar = new foo();술집이 물건이라는 건 나도 알아

또 다른 새로운 사례는 제가 푸우 코딩이라고 부르는 것입니다.곰돌이 푸우는 그의 배를 따라갑니다.나는 네가 사용하는 언어를 따르라고 하지, 그것에 반대하는 것이 아니다.

아마도 그 언어를 유지하는 사람들은 그들이 장려하려고 하는 숙어에 맞게 언어를 최적화할 것이다.새로운 키워드를 언어에 넣으면 새로운 인스턴스를 작성할 때 명확하게 하는 것이 타당하다고 생각할 수 있습니다.

언어의 의도에 따라 작성된 코드는 릴리즈될 때마다 효율이 향상됩니다.그리고 언어의 핵심 구조를 피하는 코드는 시간이 지남에 따라 어려움을 겪을 것이다.

편집: 이 기능은 퍼포먼스를 훨씬 능가합니다.이상한 코드를 발견했을 때, 「도대체 왜 그런 짓을 했을까」라고 들은(또는 말한) 횟수를 셀 수 없습니다.코드가 작성되었을 때, 거기에는 「좋은」의 이유가 있는 것이 판명되는 일이 자주 있습니다.언어의 도를 따르는 것이 몇 년 후 당신의 코드를 비웃지 않게 하는 최선의 보험입니다.

새로운 키워드를 사용하지 않고 건설사를 호출하는 문제를 줄이는 방법에 대해 글을 썼습니다.
이지만, 이 에서는 '' 를 만들 수 을 알 수 있습니다.new테스트에 보일러 플레이트 코드를 추가할 필요가 없습니다.this든든컨모

http://js-bits.blogspot.com/2010/08/constructors-without-using-new.html

이 기술의 요지는 다음과 같습니다.

/**
 * Wraps the passed in constructor so it works with
 * or without the new keyword
 * @param {Function} realCtor The constructor function.
 *    Note that this is going to be wrapped
 *    and should not be used directly 
 */
function ctor(realCtor){
  // This is going to be the actual constructor
  return function wrapperCtor(){
    var obj; // object that will be created
    if (this instanceof wrapperCtor) {
      // Called with new
      obj = this;
    } else {
      // Called without new. Create an empty object of the
      // correct type without running that constructor
      surrogateCtor.prototype = wrapperCtor.prototype;
      obj = new surrogateCtor();
    }
    // Call the real constructor function
    realCtor.apply(obj, arguments);
    return obj;
  }

  function surrogateCtor() {}
}

사용 방법은 다음과 같습니다.

// Create our point constructor
Point = ctor(function(x,y){
  this.x = x;
  this.y = y;
});

// This is good
var pt = new Point(20,30);
// This is OK also
var pt2 = Point(20,30);

새로운 키워드를 사용하지 않는 이유는 다음과 같습니다.

전혀 사용하지 않는 것으로, 실수로 빠뜨리는 것에 따른 함정을 피할 수 있습니다.YUI가 사용하는 구성 패턴은 새로운 키워드를 완전히 회피할 수 있는 예입니다.

var foo = function () {
    var pub= { };
    return pub;
}
var bar = foo();

또는 다음과 같이 할 수 있습니다.

function foo() { }
var bar = new foo();

그러나 이렇게 하면 다른 사용자가 새로운 키워드를 사용하는 것을 잊어버리고 이 오퍼레이터가 완전히 황홀해질 위험이 있습니다.AFAIK는 (사용자가 익숙하다는 것 이외에는) 이 조작에는 아무런 이점이 없습니다.

하루의 끝자락:방어적인 자세에 관한 거야새로운 문구를 사용할 수 있습니까?네, 그럼 코드가 더 위험해지나요?네.

C++라고 쓴 적이 있는 경우는, 삭제 후에 NULL로 설정하는 것과 같습니다.

"새로"라는 말은 코드에 명료함을 더해주는 것 같아요.그리고 명료함은 모든 것의 가치가 있다.함정이 있다는 건 좋은 일이지만, 명확성을 피함으로써 함정을 피하는 건 내게는 좋은 방법이 아닌 것 같아.

1: 이 1 1 1:new.

var str = new String('asd');  // type: object
var str = String('asd');      // type: string

var num = new Number(12);     // type: object
var num = Number(12);         // type: number

2: 이 2 2 2:new입니다. 않으면 그렇지 않으면 에러가 발생합니다.

new Date().getFullYear();     // correct, returns the current year, i.e. 2010
Date().getFullYear();         // invalid, returns an error

에서는 '과 ''의 두 가장 을 간략하게 할 수 .을 사용법new "예":

에 대한 new

  1. 하여 new연산자가 정상 함수로 잘못 호출되면 치명적인 영향을 미칠 수 있습니다.이 경우 함수의 코드는 의도한 대로 로컬 객체의 범위가 아닌 함수가 호출된 범위에서 실행됩니다.이로 인해 글로벌 변수와 속성이 덮어쓰여져 비참한 결과가 초래될 수 있습니다.
  2. 마지막으로 글쓰기function Func() then를니 ,를니다다 , , 。Func.prototype 그 에 '이렇게'를 할 수 있도록 합니다.new Func()어떤 프로그래머들은 건축이나 양식적인 이유로 다른 스타일의 오브젝트 상속을 선호하기 때문에 오브젝트를 구성하는 것은 추악해 보입니다.

이 주장에 대한 자세한 내용은 더글라스 크록포드의 위대하고 간결한 책 Javascript를 참조하십시오.좋은 부분들사실 어쨌든 그것을 확인해 보세요.

「」를 new

  1. 「 」의 new이치노
  2. 컨스트럭터 함수의 코드를 글로벌 네임스페이스에서 잘못 실행하는 것에 대한 이러한 문제는 컨스트럭터 함수에 항상 약간의 코드를 포함하여 올바르게 호출되고 있는지 확인하고 호출되지 않은 경우 콜을 필요에 따라 적절하게 처리하면 쉽게 방지할 수 있습니다.

이 기술에 대한 간단한 설명과 그가 지지하는 상속 모델에 대한 일반적인 자세한 설명은 John Resig의 게시물을 참조하십시오.

나는 Pez와 여기 있는 일부의 의견에 동의한다.

'new'는 그렉 딘이 묘사한 YUI 패턴이 완전히 가려진 자기 서술적 오브젝트 생성이라는 것이 명백해 보인다.

쓸 수 var bar = foo; ★★★★★★★★★★★★★★★★★」var bar = baz();baz가 물체를 만드는 방법이 아닌 경우 훨씬 더 위험해 보입니다.

나는 새로운 것이 악이라고 생각한다.실수로 사용하는 것을 잊으면 문제가 생길 수도 있기 때문이 아니라, 유전의 사슬을 망쳐서 언어를 이해하기 어렵게 하기 때문이다.

자바스크립트 모든 는 이와 .var newObj=Object.create(oldObj)여기서 oldObjnewObj의 프로토타입이라고 불립니다(따라서 "protype-based").이는 속성이 newObj에서 발견되지 않으면 oldObj에서 검색된다는 것을 의미합니다.따라서 기본적으로는 newObj는 빈 객체가 되지만 프로토타입 체인으로 인해 oldObj의 모든 값을 가진 것으로 보입니다.

로 하다 보면 , 하다, 하다, 하다.var newObj=new oldObj()newObj의 프로토타입은 oldObj.protype으로 불필요하게 이해하기 어렵습니다.

요령은 사용법이다.

Object.create=function(proto){
  var F = function(){};
  F.prototype = proto;
  var instance = new F();
  return instance;
};

새로운 기능을 사용해야 하는 것은 이 기능 내부이며, 여기서만 가능합니다.그런 다음 Object.create() 메서드를 사용합니다.이 방법은 프로토타입 문제를 해결합니다.

IMNSHO "new"는 2021년 JavaScript에서 잘못된 개념입니다.필요 없는 곳에 단어를 추가합니다.함수/컨스트럭터의 반환값을 암묵적으로 만들어 함수/컨스트럭터에서의 사용을 강제한다.코드에 노이즈를 추가하는 것은 결코 좋은 일이 아닙니다.

// With new
function Point(x, y) {
    this.x = x
    this.y = y
}
let point = new Point(0,0)

대.

// Without new
function Point(x, y) {
    return { x, y }
}
let point = Point(0,0)

언급URL : https://stackoverflow.com/questions/383402/is-javascripts-new-keyword-considered-harmful

반응형