웹 프론트엔드 JS 튜토리얼 자바스크립트 상속 학습 경험_기본지식 요약

자바스크립트 상속 학습 경험_기본지식 요약

May 16, 2016 pm 03:10 PM
javascript 상속하다

js 상속에 대해 많은 내용을 읽었으니 이제 요약할 차례입니다.
먼저 일반적인 이해를 드리겠습니다. 제가 틀렸다면 정정해 주십시오. 그러면 저의 세 가지 견해를 바로잡을 수 있습니다. 또한, 다음 예제는 원본이 아니며 단지 변수 이름을 변경한 것일 뿐이며 일부는 직접 사용하기도 합니다.

js 상속의 용도:

우선 js에는 다른 객체지향 언어와 동일한 상속 개념이 없습니다. js에서 언급하는 상속은 시뮬레이션 상속을 의미합니다.
js 상속이 정확히 무슨 일을 하나요? 처음 프론트엔드 작업을 시작할 때 인터뷰용으로 사용했습니다(처음 작은 효과를 작성할 때는 기본적으로 사용하지 않았습니다. 왜 읽어야 할까요? 면접관들이 좋아하기 때문이죠. 이 질문을 하기 위해) 그래서 그냥 인터뷰에 사용했어요. 대략적으로 살펴보시고, 인터뷰할 때 대략적인 개요를 말씀해 주신다면 이 문제에 대한 좋은 면접관이라고 생각합니다. 나중에는 개념이 그다지 명확하지 않았음에도 불구하고 점차적으로 사용하기 시작했습니다.
실제로는 어떤 용도로 사용되나요? 주로 이전에 작성한 코드를 재사용하는 데 사용됩니다. 예를 들어, 우리가 함수나 객체를 작성했거나 다른 사람이 작성한 것을 사용했는데 우리가 직접 뭔가를 추가하고 싶다면 다른 사람의 것을 변경할 수는 없습니다. 상속의 실제 사용.

js 상속 구현 방법:
먼저 코드에 들어가지는 않고 제 생각을 먼저 말씀드리겠습니다. 실제로 상속은 다른 객체(js의 모든 것은 객체입니다)의 속성이나 메서드를 우리 객체로 전송하여 우리 객체를 사용할 수 있도록 하는 방법을 찾는 것입니다. 이는 또한 재사용 목적을 달성합니다.
이제 목적이 분명해졌으니 이를 달성하기 위한 수단은 다음과 같습니다.
js의 특성에 따라 구현은 다음 방법 중 하나 또는 조합에 지나지 않습니다.

1. 생성자, js는 생성자에 대한 엄격한 정의가 없는 것 같지만 new를 사용하여 새 개체를 만들 수 있습니다. 생성자 역시 엄격한 객체지향 언어에서 상속을 구현하기 위한 방법이라고 하기 때문에 당연히 js에서도 시뮬레이션이 가능하므로 oop 언어를 배워본 분들이라면 이런 생각이 먼저 드실 겁니다.

2. 함수 프로토타입과 프로토타입 체인을 사용하여 두 객체를 연결합니다. js 프로토타입 체인은 상대적으로 독특하기 때문에 이렇게 생각하기 쉽습니다.
프로토타입에는 여러 가지 유형이 있습니다. 즉, 상속된 객체의 프로토타입, 상속된 객체의 프로토타입 또는 상속된 객체의 인스턴스 또는 직접 상속자로 사용되는 것입니다. 이러한 프로토타입을 상속 개체로 사용하여 얻는 상속 효과는 다릅니다.

3. 속성 및 메소드 복사 상속된 객체의 모든 속성 또는 메소드를 복사하여 자체 객체의 속성 및 메소드로 변환하면 매우 원활하게 사용할 수 있습니다. 물론 이는 얕은 복사와 깊은 복사라는 두 가지 상황으로 나눌 수 있습니다.

4. 호출과 적용이라는 두 가지 메서드를 사용하세요. 이 두 메서드는 함수 실행 컨텍스트를 변경할 수 있습니다(this). 따라서 이 두 메서드를 사용하면 상속된 메서드의 상속과 재사용도 실현할 수 있습니다. 물체. .

일반적으로 js에서 상속을 달성하는 방법은 아마도 이러한 방법을 기반으로 모두 결합되고 업그레이드됩니다. 물론 사용의 효과 때문입니까? 단일 방법은 이상적이지 않습니다. 물론, 자신의 요구 사항을 충족하고 이를 달성하기 위해 어떤 방법을 사용해야 하는지 명시하지 않는 한 프로젝트의 실제 요구 사항에 따라 사용할 방법을 선택할 수 있습니다. 베이징에서 스자좡까지 가는 가장 빠른 방법은 비행기라고 말하는 것과 같습니다. 하지만 공항까지의 이동, 공항에서 시내로의 이동 등 공항과의 거리가 전반적으로 고속철도만큼 빠르지 않다면 고속철도를 이용할 수 있습니다. 예를 들어, 자동차가 있고 운전을 할 수 있지만, 도전하고 싶다면 자전거를 타는 것이 좋습니다.


코드 구현, 코드를 기반으로 위의 구현 방법에 대해 이야기해 보겠습니다. 그 중 일부는 다른 곳에서 가져온 것이며 몇 가지 설명을 추가합니다.

js 상속에 대해 많은 내용을 읽었으니 이제 요약할 차례입니다.
먼저 일반적인 이해를 드리겠습니다. 제가 틀렸다면 정정해 주십시오. 그러면 저의 세 가지 견해를 바로잡을 수 있습니다. 또한, 다음 예제는 원본이 아니며 단지 변수 이름을 변경한 것일 뿐이며 일부는 직접 사용하기도 합니다.

js 상속의 용도:

우선 js에는 다른 객체지향 언어와 동일한 상속 개념이 없습니다. js에서 언급하는 상속은 시뮬레이션 상속을 의미합니다.
js 상속이 정확히 무슨 일을 하나요? 처음 프론트엔드 작업을 시작할 때 인터뷰용으로 사용했습니다(처음 작은 효과를 작성할 때는 기본적으로 사용하지 않았습니다. 왜 읽어야 할까요? 면접관들이 좋아하기 때문이죠. 이 질문을 하기 위해) 그래서 그냥 인터뷰에 사용했어요. 대략적으로 살펴보시고, 인터뷰할 때 대략적인 개요를 말씀해 주신다면 이 문제에 대한 좋은 면접관이라고 생각합니다. 나중에는 개념이 그다지 명확하지 않았음에도 불구하고 점차적으로 사용하기 시작했습니다.
실제로는 어떤 용도로 사용되나요? 주로 이전에 작성한 코드를 재사용하는 데 사용됩니다. 예를 들어, 우리가 함수나 객체를 작성했거나 다른 사람이 작성한 것을 사용했는데 우리가 직접 뭔가를 추가하고 싶다면 다른 사람의 것을 변경할 수는 없습니다. 상속의 실제 사용.

js 상속을 구현하는 방법:
먼저 코드에 대해 이야기하지 말고 먼저 아이디어에 대해 이야기합시다. 실제로 상속은 다른 객체(js의 모든 것은 객체입니다)의 속성이나 메서드를 우리 객체로 전송하여 우리 객체를 사용할 수 있도록 하는 방법을 찾는 것입니다. 이는 또한 재사용 목적을 달성합니다.
이제 목적이 분명해졌으니 이를 달성하기 위한 수단은 다음과 같습니다.
js의 특성에 따라 구현은 다음 방법 중 하나 또는 조합에 지나지 않습니다.

1. 생성자, js는 생성자에 대한 엄격한 정의가 없는 것 같지만 new를 사용하여 새 개체를 만들 수 있습니다. 생성자 역시 엄격한 객체지향 언어에서 상속을 구현하기 위한 방법이라고 하기 때문에 당연히 js에서도 시뮬레이션이 가능하므로 oop 언어를 배워본 분들이라면 이런 생각이 먼저 드실 겁니다.

2. 함수 프로토타입과 프로토타입 체인을 사용하여 두 객체를 연결합니다. js 프로토타입 체인은 상대적으로 독특하기 때문에 이렇게 생각하기 쉽습니다.
프로토타입에는 여러 가지 유형이 있습니다. 즉, 상속된 객체의 프로토타입, 상속된 객체의 프로토타입 또는 상속된 객체의 인스턴스 또는 직접 상속자로 사용되는 것입니다. 이러한 프로토타입을 상속 개체로 사용하여 얻는 상속 효과는 다릅니다.

3. 속성 및 메소드 복사 상속된 객체의 모든 속성 또는 메소드를 복사하여 자체 객체의 속성 및 메소드로 변환하면 매우 원활하게 사용할 수 있습니다. 물론 이는 얕은 복사와 깊은 복사라는 두 가지 상황으로 나눌 수 있습니다.

4. 호출과 적용이라는 두 가지 메서드를 사용하세요. 이 두 메서드는 함수 실행 컨텍스트를 변경할 수 있습니다(this). 따라서 이 두 메서드를 사용하면 상속된 메서드의 상속과 재사용도 실현할 수 있습니다. 물체. .

일반적으로 js에서 상속을 달성하는 방법은 아마도 이러한 방법을 기반으로 모두 결합되고 업그레이드됩니다. 물론 사용의 효과 때문입니까? 단일 방법은 이상적이지 않습니다. 물론, 자신의 요구 사항을 충족하고 이를 달성하기 위해 어떤 방법을 사용해야 하는지 명시하지 않는 한 프로젝트의 실제 요구 사항에 따라 사용할 방법을 선택할 수 있습니다. 베이징에서 스자좡까지 가는 가장 빠른 방법은 비행기라고 말하는 것과 같습니다. 하지만 공항까지의 이동, 공항에서 시내로의 이동 등 공항과의 거리가 전반적으로 고속철도만큼 빠르지 않다면 고속철도를 이용할 수 있습니다. 예를 들어, 자동차가 있고 운전을 할 수 있지만, 도전하고 싶다면 자전거를 타는 것이 좋습니다.


코드 구현, 코드를 기반으로 위의 구현 방법에 대해 이야기해 보겠습니다. 그 중 일부는 다른 곳에서 가져온 것이며 몇 가지 설명을 추가합니다.

1. 생성자 구현(생성자 차용):

function Super(arg){
      this.arr1 = "I'm super "+arg;
      this.show = function(){
        alert(this.arr1);
      }
    }

    Super.prototype.say = function(){
      alert(this.arr1);
    }

    function suber(arg){
      Super.apply(this, arguments); //在suber的上下文中运行super
    }

    var sub =new suber("suber");
    var sub2 = new suber("suber1");

    console.log(sub.arr1); //I'm super suber
    console.log(sub.show); //function (){ alert(this.arr1);}
    console.log(sub.say); //undefined
    console.log(sub.show === sub2.show); //false
로그인 후 복사

앗, sub.say가 정의되지 않은 것을 발견했습니다. 이는 상속되지 않았음을 의미합니다. 아래 두 객체 sub와 sub2의 표시는 동일하지 않습니다. 이는 두 함수가 두 개의 다른 객체를 가리킨다는 의미입니다. 복사가 2개 나왔어요.

따라서 이 메서드가 상속을 구현하는 경우 프로토타입 개체의 속성과 메서드는 상속되지 않으며 Super의 속성과 메서드는 새 개체마다 별도로 복사됩니다.
따라서 프로토타입의 메서드 중 어느 것도 상속되지 않았기 때문에 상속을 구현하기 위해 이 메서드만 사용하는 것은 적절하지 않습니다. 그래서 마스터들은 프로토타입 상속이라는 아이디어를 생각해 냈습니다

2. 프로토타입 상속:

function Super(arg){
      this.arr1 = "I'm super "+arg;
      this.show = function(){
        alert(this.arr1);
      }
    }

    Super.prototype.say = function(){
      alert(this.arr1);
    }

    function suber(arg){}

    suber.prototype = new Super();

    var sub = new suber("suber1");
    var sub2 = new suber("suber2");

    console.log(sub.arr1); //I'm super undefined
    console.log(sub.show); //function (){ alert(this.arr1);}
    console.log(sub.say); //function (){ alert(this.arr1);}
    console.log(sub.show === sub2.show);  //true;
    console.log(sub.say === sub2.say);  //true;
로그인 후 복사


이번에는 arr1을 상속받았으나 매개변수가 추가되지 않고 정의되지 않았기 때문에 이 메소드의 서브클래스를 선언할 때 전달된 매개변수와 서브클래스에서 상속받은 속성을 받을 수 없었습니다. 다른 모든 것은 꽤 정상입니다. Show와 Say는 모두 상속됩니다. 다만 주목할 점은 say는 super의 프로토타입 객체를 통해 상속되고, show는 새로운 슈퍼 객체 인스턴스를 생성할 때 해당 인스턴스의 속성이라는 점입니다.

그럼 프로토타입에 어떻게 매개변수 전송을 구현하고 상속하는 걸까요? 물론 위의 두 가지 방법을 결합하면 되기 때문에 선배님들은 다음과 같은 방법을 고안해 냈습니다


3. 결합 상속(생성자 대여 및 프로토타입 설정):

function Super(arg){
      this.arr1 = "I'm super "+arg;
      this.show = function(){
        alert(this.arr1);
      }
    }

    Super.prototype.say = function(){
      alert(this.arr1);
    }

    function suber(arg){
      Super.apply(this, arguments);
    }

    suber.prototype = new Super();


    var sub = new suber("suber1");
    var sub2 = new suber("suber2");

    console.log(sub.arr1); //I'm super suber1
    console.log(sub.show); //function (){ alert(this.arr1);}
    console.log(sub.say); //function (){ alert(this.arr1);}
    console.log(sub.show === sub2.show);  //false;
    console.log(sub.say === sub2.say);  //true;
로그인 후 복사

이번에는 거의 완벽하지만 sub.show와 sub2.show가 동일하지 않다는 것을 알 수 있습니다. 적용 위치가 show를 suber 고유의 속성으로 만든 다음 suber 프로토타입에 넣으면 되기 때문입니다. 쇼(Super의 쇼는 하위 프로토타입 개체의 인스턴스 개체로 사용됨)가 덮어쓰기되므로 한 번에 하나씩 복사됩니다. 물론 이를 피할 수 있는 방법은 없습니다. 이러한 불필요한 오버헤드를 발생시키지 않기 위해 이러한 공유 가능한 기능 중 더 많은 기능을 프로토타입 객체에 배치할 수 있습니다.
suber 생성 시 호출과 하위 프로토타입 객체에 값을 할당할 때의 호출로 인해 Super가 두 번 호출되기 때문에 새로운 하위 객체가 생성될 때마다 Super가 두 번 호출되고, 다음과 같은 경우 두 개의 인스턴스 객체가 생성됩니다. 두 번 호출해야 합니다.

그래서 선배들은 이 문제를 해결하기 위해 마음을 열고 다음과 같은 방법을 개발했습니다.

4. 기생 조합 상속:
이 방법과 방법 3의 주요 차이점은 부모 클래스 예제가 아닌 자식 클래스 프로토타입에 부모 클래스 프로토타입이 할당된다는 점입니다

function Super(arg){
  this.arr1 = "I'm super "+arg;
  
}

Super.prototype.show = function(){ //这个方法放到了原型对象上。
    alert(this.arr1);
  }
Super.prototype.say = function(){
  alert(this.arr1);
}

function suber(arg){
  Super.apply(this, arguments);
}

/*inherit函数的作用,使用一个新的空函数,来切断父类对象的原型对象与子类原型对象的直接联系,而是通过这个空构造的实例对象实现继承,这样可以避免更改子类原型的属性或者方法而影响了父类原型对象的属性或者方法。*/

function inherit(obj){ 
  function F(){}
  F.prototype = obj;
  return new F();  
}

suber.prototype = inherit(Super.prototype);


var sub = new suber("suber1");
var sub2 = new suber("suber2");

console.log(sub.arr1); //I'm super suber1
console.log(sub.show); //function (){ alert(this.arr1);}
console.log(sub.say); //function (){ alert(this.arr1);}
console.log(sub.show === sub2.show);  //true;
console.log(sub.say === sub2.say);  //true;
로그인 후 복사

好了,这样就把三方法的弊端干掉了,这个可以完美的使用了吧。

五、复制属性实现

拷贝我们可以写一个拷贝函数来实现。

function extend(Super,suber){
  suber = suber || {};
  for(var i in Super){
    if(Super.hasOwnProperty(i)){
      suber[i] = Super[i];
    }
   }
  return suber;
}


var parent = {
  name:"dad",
  num:[1,2,3],
  say:function(){alert("dad");}
}

var child = {
  age:5,
  sex:"boy"
};

child = extend(parent, child);

//以下测试
console.log(child); /*{
             age:5,
             sex:"boy",
             name:"dad",
             num:[1,2,3],
             say:function(){alert("dad");}
            }*/
console.log(child.say === parent.say); //true
console.log(child.num === parent.num); //true
로그인 후 복사

复制成功,那么child成功继承了parent的一些属性,但是后面两个测试发现他们是相等的,就表明了他们在公用同一个数组,同一个函数,函数这个可以,但是数组这个就有问题了,如果一个chiild改变了数组,几个被继承对象的数组也跟着变了,这就不给力了啊。
为什么会发生这种情况呢,js里边对象存储的是指针,然后这个指针指向这个值,我们在这复制的实际是指向该对象的指针的值,所以继承对象和被继承对象都指向了同一个对象,接下来看看如何使用深度复制来解决这个问题。

深度复制对象属性:

function extenddeep(Super, suber){
      var tostr = Object.prototype.toString, astr = "[object Array]";
      suber = suber || {};

      for(var i in Super){
        if(Super.hasOwnProperty(i)){
          if(typeof Super[i] === "object"){
            suber[i] = (tostr.call(Super[i]) == astr) ? [] : {};
            extenddeep(Super[i],suber[i]);
          }else {
            suber[i] = Super[i];
          }
        }
      }

      return suber;
    }


    var parent = {
      name:"papa",
      num:[1,2,3],
      say:function(){alert("I'm father of my son!");}
    }

    var child = {
      name:"jone",
      sex:"boy",
    }

    var kid = extenddeep(parent, child);

    console.log(kid);  // {name: "papa"
                num: Array[3]
                say: ()
                sex: "boy"
              // }

    console.log(kid.say === parent.say); //true
    console.log(kid.num === parent.num);  //false
    console.log(kid.name); //papa
로그인 후 복사

好了,深度复制完毕,但似有木有发现问题,name是parent的,也就是说如果继承对象有和被继承对象一样的属性名的属性如果不做处理就会被替换掉。那么我们可以做一下处理,先声明一个属性,保存parent里的东西,剩下的的当然就是child自己的东西了,最后再把属性给child对象就可以了。

六、利用call和apply这两个方法(借用方法)。
这个就是通过call和apply来复用其他对象的方法,达到复用的目的。

var one = {
      name:"object",
      say: function(greet){
        return greet + ', ' + this.name;
      }
    }

    var tow = {
      name:"two"
    }

    one.say.call(tow, "hi");  //hi, two
로그인 후 복사

这个就是借用了,好了,下课。

好吧,好吧,其实这里边还有其他东西要看。可以借用并不“带表”可以随便把某个方法赋值给谁然后跟没发生什么似的继续用。所以我们平时使用借用时要注意一下上下文,下面看下那些容易出错的地方。

//赋值给一个变量时候上下文会变化
    var say = one.say;
    console.log(say('hoho')); // "hoho, undefined"

    //作为回调函数时也会发生变化
    var yetother = {
      name:"yetother obj",
      method:function(callback){
        return callback("Hola");
      }
    }

    console.log(yetother.method(one.say)); //"Hola, "
로그인 후 복사

神马意思呢,就是this.name是undefined,当one.say赋值给say是,实际上是say存储了指向函数对象的指针,say这个变量明显又是全局变量的一个属性,那么它运行的时候实际的上下文就变成了windows了,当然这个时候name就变成undefined了。回调这个也是一样,return 的是函数运行的结果。如果我们事先设置 windows.name="windows" 那么得到的结果就变成了 "hoho, windows" 和"Hola, windows" 了。

function bind(o, m){
      return function(){
        return m.apply(o, [].slice.call(arguments));
      }
    }

    var othersay = bind(yetother, one.say);

    othersay("Hola"); //"Hola, yetother obj"
로그인 후 복사

通过apply可以改变方法执行的上下文,那么我们构建一个函数来实现这样一个功能,通过使用方法调用实现上下文的改变,这样就不会出现上下文不是我们期望的上下文的情况了。

//这段是直接复制过来的。
    // ECMAScript 5给Function.prototype添加了一个bind()方法,以便很容易使用apply()和call()。

      if (typeof Function.prototype.bind === 'undefined') {
        Function.prototype.bind = function (thisArg) {
          var fn = this,
      slice = Array.prototype.slice,
      args = slice.call(arguments, 1);
          return function () {
            return fn.apply(thisArg, args.concat(slice.call(arguments)));
          };
        };
      }

      var twosay2 = one.say.bind(two);
      console.log(twosay2('Bonjour')); // "Bonjour, another object"

      var twosay3 = one.say.bind(two, 'Enchanté');
      console.log(twosay3()); // "Enchanté, another object"
로그인 후 복사

介绍完了,该说说自己的疑惑了,当复制属性方法遇到的被继承对象里边存在方法,如何单独复制出来呢,现在的是直接共用了,因为毕竟方法一般不会经常改动。求解答?

下面是转载过来的jQuery的extend方法,好像也没有特殊处理函数这块,继承完了两个函数也是共用的。

$.extend源码

jQuery.extend = jQuery.fn.extend = function() {
          var options, name, src, copy, copyIsArray, clone,
             target = arguments[0] || {},
             i = 1,
             length = arguments.length,
             deep = false ;

          // Handle a deep copy situation
          //如果第一个参数是boolean类型
          //修正参数,将第二个参数作为target
          if ( typeof target === "boolean" ) {
             deep = target;

              // skip the boolean and the target
             target = arguments[ i ] || {};
              //i++是为了后续 i === length的判断
             i++;
          }

          // Handle case when target is a string or something (possible in deep copy)
          //如果目标既不是对象也不是方法(例如给基本类型扩展属性方法和属性不会报错但是是无用的),修正target为 js对象
          if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
             target = {};
          }

          // extend jQuery itself if only one argument is passed
          //如果只有一个参数,修正对象为JQuery函数或JQuery对象
          if ( i === length ) {
             target = this ;
              //修正target所在位置,后面的都是要添加给target的对象
             i--;
          }

          for ( ; i < length; i++ ) {
              // Only deal with non-null/undefined values
              if ( (options = arguments[ i ]) != null ) {
                 // Extend the base object
                 for ( name in options ) {
                    src = target[ name ];
                    copy = options[ name ];

                    // Prevent never-ending loop
                    //如果target和copy是同一个对象,略过,防止自己的属性引用了本身对象导致的循环引用,以致GC无法回收
                    if ( target === copy ) {
                        continue ;
                    }

                    // Recurse if we're merging plain objects or arrays
                    //如果是deep为true,并且要添加给target的copy为对象获数组
                    if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
                        if ( copyIsArray ) {
                           copyIsArray = false ;
                           clone = src && jQuery.isArray(src) &#63; src : [];

                       } else {
                           clone = src && jQuery.isPlainObject(src) &#63; src : {};
                       }
                 
                        // Never move original objects, clone them
                        //很巧妙 ,用一个递归,实现引用对象的深克隆,递归的返回条件是属性石基本类型,基本类型都是深克隆
                       target[ name ] = jQuery.extend( deep, clone, copy );

                    // Don't bring in undefined values
                    } else if ( copy !== undefined ) {
                        //浅克隆
                       target[ name ] = copy;
                    }
                 }
             }
          }

          // Return the modified object
          return target;
      };
로그인 후 복사

以上这篇javascript 继承学习心得总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

C++ 함수 상속에 대한 자세한 설명: 상속에서 '기본 클래스 포인터'와 '파생 클래스 포인터'를 사용하는 방법은 무엇입니까? C++ 함수 상속에 대한 자세한 설명: 상속에서 '기본 클래스 포인터'와 '파생 클래스 포인터'를 사용하는 방법은 무엇입니까? May 01, 2024 pm 10:27 PM

함수 상속에서는 "기본 클래스 포인터" 및 "파생 클래스 포인터"를 사용하여 상속 메커니즘을 이해합니다. 기본 클래스 포인터가 파생 클래스 개체를 가리키는 경우 상향 변환이 수행되고 기본 클래스 멤버에만 액세스됩니다. 파생 클래스 포인터가 기본 클래스 개체를 가리키는 경우 하향 캐스팅이 수행되므로(안전하지 않음) 주의해서 사용해야 합니다.

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 Jan 05, 2024 pm 06:08 PM

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

상속과 다형성은 C++의 클래스 결합에 어떤 영향을 미치나요? 상속과 다형성은 C++의 클래스 결합에 어떤 영향을 미치나요? Jun 05, 2024 pm 02:33 PM

상속과 다형성은 클래스 결합에 영향을 줍니다. 상속은 파생 클래스가 기본 클래스에 종속되기 때문에 결합을 증가시킵니다. 다형성은 객체가 가상 함수와 기본 클래스 포인터를 통해 일관된 방식으로 메시지에 응답할 수 있기 때문에 결합을 줄입니다. 모범 사례에는 상속을 적게 사용하고, 공용 인터페이스를 정의하고, 기본 클래스에 데이터 멤버를 추가하지 않고, 종속성 주입을 통해 클래스를 분리하는 것이 포함됩니다. 다형성과 종속성 주입을 사용하여 은행 계좌 애플리케이션에서 결합을 줄이는 방법을 보여주는 실제 예입니다.

C++ 함수 상속에 대한 자세한 설명: 상속 오류를 디버깅하는 방법은 무엇입니까? C++ 함수 상속에 대한 자세한 설명: 상속 오류를 디버깅하는 방법은 무엇입니까? May 02, 2024 am 09:54 AM

상속 오류 디버깅 팁: 올바른 상속 관계를 확인하세요. 디버거를 사용하여 코드를 단계별로 실행하고 변수 값을 검사합니다. 가상 수정자를 올바르게 사용했는지 확인하세요. 숨겨진 상속으로 인해 발생하는 상속 다이아몬드 문제를 살펴봅니다. 추상 클래스에서 구현되지 않은 순수 가상 함수를 확인하세요.

C++ 함수 상속에 대한 자세한 설명: 상속에서 'is-a' 및 'has-a' 관계를 이해하는 방법은 무엇입니까? C++ 함수 상속에 대한 자세한 설명: 상속에서 'is-a' 및 'has-a' 관계를 이해하는 방법은 무엇입니까? May 02, 2024 am 08:18 AM

C++ 함수 상속에 대한 자세한 설명: "is-a"와 "has-a" 사이의 관계를 마스터하세요. 함수 상속이란 무엇인가요? 함수 상속은 파생 클래스에 정의된 메서드를 기본 클래스에 정의된 메서드와 연결하는 C++의 기술입니다. 파생 클래스가 기본 클래스의 메서드에 액세스하고 재정의할 수 있도록 하여 기본 클래스의 기능을 확장합니다. "is-a" 및 "has-a" 관계 함수 상속에서 "is-a" 관계는 파생 클래스가 기본 클래스의 하위 유형, 즉 파생 클래스가 기본 클래스의 특성과 동작을 "상속"함을 의미합니다. 기본 클래스. "has-a" 관계는 파생 클래스에 기본 클래스 개체에 대한 참조 또는 포인터가 포함되어 있음을 의미합니다. 즉, 파생 클래스가 기본 클래스 개체를 "소유"합니다. 구문다음은 함수 상속을 구현하는 방법에 대한 구문입니다. classDerivedClass:pu

JavaScript에서 HTTP 상태 코드를 쉽게 얻는 방법 JavaScript에서 HTTP 상태 코드를 쉽게 얻는 방법 Jan 05, 2024 pm 01:37 PM

JavaScript에서 HTTP 상태 코드를 얻는 방법 소개: 프런트 엔드 개발에서 우리는 종종 백엔드 인터페이스와의 상호 작용을 처리해야 하며 HTTP 상태 코드는 매우 중요한 부분입니다. HTTP 상태 코드를 이해하고 얻는 것은 인터페이스에서 반환된 데이터를 더 잘 처리하는 데 도움이 됩니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTTP 상태 코드란 무엇입니까? HTTP 상태 코드는 브라우저가 서버에 요청을 시작할 때 서비스가

'PHP의 객체 지향 프로그래밍 소개: 개념에서 실습까지' 'PHP의 객체 지향 프로그래밍 소개: 개념에서 실습까지' Feb 25, 2024 pm 09:04 PM

객체 지향 프로그래밍이란 무엇입니까? 객체 지향 프로그래밍(OOP)은 실제 엔터티를 클래스로 추상화하고 객체를 사용하여 이러한 엔터티를 나타내는 프로그래밍 패러다임입니다. 클래스는 객체의 속성과 동작을 정의하고, 객체는 클래스를 인스턴스화합니다. OOP의 가장 큰 장점은 코드를 더 쉽게 이해하고 유지 관리하며 재사용할 수 있다는 것입니다. OOP의 기본 개념 OOP의 주요 개념에는 클래스, 개체, 속성 및 메서드가 포함됩니다. 클래스는 객체의 속성과 동작을 정의하는 객체의 청사진입니다. 객체는 클래스의 인스턴스이며 클래스의 모든 속성과 동작을 갖습니다. 속성은 데이터를 저장할 수 있는 개체의 특성입니다. 메소드는 객체의 데이터에 대해 작동할 수 있는 객체의 함수입니다. OOP의 장점 OOP의 주요 장점은 다음과 같습니다. 재사용성: OOP는 코드를 더 많이 만들 수 있습니다.

C++ 함수 상속 설명: 언제 상속을 사용하지 않아야 합니까? C++ 함수 상속 설명: 언제 상속을 사용하지 않아야 합니까? May 04, 2024 pm 12:18 PM

다음 상황에서는 C++ 함수 상속을 사용하면 안 됩니다. 파생 클래스에 다른 구현이 필요한 경우 다른 구현을 사용하는 새 함수를 만들어야 합니다. 파생 클래스에 함수가 필요하지 않은 경우 빈 클래스로 선언하거나 구현되지 않은 전용 기본 클래스 멤버 함수를 사용하여 함수 상속을 비활성화해야 합니다. 함수에 상속이 필요하지 않은 경우 코드 재사용을 위해 다른 메커니즘(예: 템플릿)을 사용해야 합니다.

See all articles